2015-10-13 17 views
5

ich ein Telemetrie-Logger für einige separaten Plattformen entworfen habe das zusammengesetzte Muster mitC#, Schloss Windsor und das Composite-Entwurfsmuster

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()); 
    } 
} 

Jetzt mag ich in der Lage sein, eine Instanz von „Vielen“ bekommen von Windsor Containern aber haben ein paar Probleme:

  • wenn alle ILoggers in dem Behälter sind, wie ich sicher, kann ich die „Viele“ Umsetzung und nicht „A“ oder „B“ bekommen?

  • ich nach diesem Beispiel versucht Castle Windsor: How do I inject all implementations of interface into a ctor? und verwenden container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); eine Klasse mit IEnumerable dependancy zu registrieren, aber wenn auch, dass Klasse implementiert IComponent pflegt es eine kreisförmige Abhängigkeit schaffen?

Ist was ich versuche, sogar möglich?

Antwort

4

Zunächst ist dies Composite Design Pattern nicht Komponente.

Die Art und Weisen Sie es in Schloss Windsor in Ihrem Fall zu tun wie dies Dies funktioniert

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>()); 

aussehen soll, weil Schloss Windsor internes Verständnis von Mustern wie Composite- oder Dekorateur hat so keine zirkuläre Abhängigkeit in diesem Fall erstellt werden . Beachten Sie, dass die Reihenfolge der Registrierung in diesem Fall wichtig ist.

Mehr zur Registrierung verschiedener Muster in Schloss Windsor finden Sie here.

0

Ist es mit einer Fabrikmethode in der Behälterregistrierung möglich?

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>(); 

Nach dem Wechsel:

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

begrenzte Kenntnis des Windsor Container mich führen dazu, gibt es wahrscheinlich eine Verbesserung dieses auf der gleichen Linie von einer Fabrik mit Ihrem Objekt zu initialisieren. Die wichtige Sache ist die Konfiguration ist innerhalb des Containers (auch wenn es ein wenig wortreich ist)

Verwandte Themen