Ich verwende Castle Windsor 2.5 in meiner Anwendung. Ich habe einen Dienst, der ein Kompositum ist, das als Verteiler für Objekte dient, die dieselbe Schnittstelle implementieren.
public interface IService { void DoStuff(string someArg); }
public class ConcreteService1 : IService {
public void DoStuff(string someArg) { }
}
public class ConcreteService2 : IService {
public void DoStuff(string someArg) { }
}
public class CompositeService : List<IService>, IService
{
private readonly IService[] decoratedServices;
CompositeService(params IService[] decoratedServices) {
this.decoratedServices = decoratedServices;
}
public void DoStuff(string someArg) {
foreach (var service in decoratedServices) {
service.DoStuff(someArg);
}
}
}
Das Problem, das ich habe, ist, dass die Verwendung einer Konfiguration wie der unten gezeigten dazu führt, dass Windsor meldet: "Beim Versuch, eine Abhängigkeit aufzulösen, wurde ein Zyklus festgestellt."
windsor.Register(
Component
.For<IService>()
.ImplementedBy<CompositeService>(),
Component
.For<IService>()
.ImplementedBy<ConcreteService1>(),
Component
.For<IService>()
.ImplementedBy<ConcreteService2>()
);
Dieses zyklische Verhalten scheint im Widerspruch zu dem standardmäßigen (nicht sammlungsbasierten) Verhalten zu stehen, das verwendet werden kann, um das Dekoratormuster zu implementieren, bei dem die aufgelöste Komponente ignoriert und stattdessen die nächste registrierte Komponente, die dieselbe Schnittstelle implementiert, verwendet wird.
Ich würde also gerne wissen, ob es eine Möglichkeit gibt, Windsor dazu zu bringen, die CompositeService
Komponente, wenn sie die Auflösung der IService
Dienstleistungen für die decoratedServices
Eigentum. Die decoratedServices
Eigenschaft sollte zwei Elemente enthalten: eine Instanz von ConcreteService1
und eine Instanz von ConcreteService2
. Ich möchte dies tun, ohne die Abhängigkeiten explizit anzugeben.