2015-10-13 16 views
5

Ho progettato un logger telemetria per alcuni piattaforme separate utilizzando il compositeC#, Castello di Windsor e Il design composito modello

public interface ILogger 
{ 
    void Log(); 
} 

public class A : ILogger 
{ 
    public void Log(...); 
} 

public class B : ILogger 
{ 
    public void Log(...); 
} 

public class Many : ILogger 
{ 
    private readonly List<ILogger> m_loggers; 

    public Many(IEnumerable<ILogger> loggers) 
    { 
     m_loggers = loggers.ToList(); 
    } 

    public void Log() 
    { 
     m_loggers.ForEach(c => c.Log()); 
    } 
} 

Ora voglio essere in grado di ottenere un 'istanza di "Molti" dal contenitore Windsor ma hanno incontrato alcuni problemi:

  • se tutti ILoggers sono nel contenitore come posso essere sicuro di ottenere i "molti" implementazione e non "a" o "B"?

  • Ho provato seguendo questo esempio Castle Windsor: How do I inject all implementations of interface into a ctor? e utilizzare container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); per registrare una classe con dipendenza IEnumerable ma se tale classe implementa anche IComponent solito si crea una circolare dipendenza?

È quello che sto tentando anche possibile?

risposta

4

Prima di tutto si tratta di Composite Design Pattern not Component.

Il modo in cui lo si fa in Castello di Windsor nel tuo caso dovrebbe assomigliare a questo

container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); 
container.Register(Component.For<ILogger>().ImplementedBy<Many>()); 
container.Register(Component.For<ILogger>().ImplementedBy<A>()); 
container.Register(Component.For<ILogger>().ImplementedBy<B>()); 

Questo funziona perché il Castello di Windsor hanno comprensione interna di modelli come composito o Decorator in modo che nessun dipendenza circolare verrà creato in questo caso . Basta ricordare che l'ordine di registrazione è importante in questo caso.

Ulteriori informazioni sulla registrazione di modelli diversi nel Castello di Windsor possono essere trovate here.

0

È possibile con un metodo di fabbrica nella registrazione del contenitore?

var container = new Castle.Windsor.WindsorContainer(); 
    container.Register(Component.For<A>()); 
    container.Register(Component.For<B>()); 
    container.Register(Component.For<ILogger>() 
     .UsingFactoryMethod(k => new Many(k.Resolve<A>(), k.Resolve<B>()))); 

    var logger = container.Resolve<ILogger>(); 

Dopo aver modificato:

public Many(params ILogger [] loggers) 
    { 
     m_loggers = loggers.ToList(); 
    } 

conoscenza limitata dei Windsor Container mi portano a questo, v'è probabilmente un miglioramento a questa lungo le stesse linee di utilizzo di una fabbrica per inizializzare l'oggetto. La cosa importante è che la configurazione sia all'interno del contenitore (anche se è un po 'prolissa)