2015-10-13 26 views
5

Mam zaprojektowane rejestratora telemetrii dla kilku oddzielnych platformach za pomocą złożonego wzoruC#, Zamek Windsor i złożona wzornictwo

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

Teraz chcę być w stanie uzyskać instancją „wiele” z kontenera Windsor ale spotkałem kilka problemów:

  • jeśli wszystkie ILoggers są w pojemniku w jaki sposób można upewnić się uzyskać „wiele” wdrażanie i nie „a” lub „B”?

  • Próbowałem po tym przykładzie Castle Windsor: How do I inject all implementations of interface into a ctor? i używać container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); zarejestrować klasę z IEnumerable dependancy ale jeśli że klasa implementuje również IComponent przyzwyczajenie to stworzyć okrągły zależność?

Czy to, co próbuję, jest możliwe?

Odpowiedz

4

Po pierwsze jest to wzór złożony, a nie komponent.

Sposób to zrobić w zamku Windsor w twoim przypadku powinien wyglądać ten

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

To działa, ponieważ Zamek Windsor mieć wewnętrzną zrozumienie wzorców jak Composite lub Dekorator tak nie okrągły zależność zostanie utworzony w tym przypadku . Pamiętając, że kolejność rejestracji jest w tym przypadku ważna.

Więcej informacji na temat rejestrowania różnych wzorów w zamku Windsor można znaleźć here.

0

Czy jest to możliwe z metodą fabryczną w rejestracji pojemnika?

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

Po zmianie:

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

Ograniczona wiedza o Container Windsor doprowadzić mnie do tego nie ma chyba poprawa to według tych samych zasad korzystania fabrykę zainicjować swój obiekt. Ważną rzeczą jest to, że konfiguracja znajduje się w kontenerze (nawet jeśli jest trochę verbose).

Powiązane problemy