我在我的应用程序中使用 CaSTLe Windsor 2.5。我有一个服务,它是一个复合体,充当实现相同接口(interface)的对象的分发器。
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);
}
}
}
我遇到的问题是,使用如下所示的配置会导致 Windsor 报告“尝试解析依赖项时检测到循环。”
windsor.Register(
Component
.For<IService>()
.ImplementedBy<CompositeService>(),
Component
.For<IService>()
.ImplementedBy<ConcreteService1>(),
Component
.For<IService>()
.ImplementedBy<ConcreteService2>()
);
这种循环行为似乎与可用于实现装饰器模式的标准(非基于集合的)行为不一致,在装饰器模式中,正在解析的组件将被忽略,并使用实现相同接口(interface)的下一个注册组件相反。
所以我想知道是否有办法让 Windsor 在为 解析
属性。 IService
服务时排除 CompositeService
组件>decoratedServicesdecoratedServices
属性应包含两项:ConcreteService1
实例和 ConcreteService2
实例。我想在不明确指定依赖项的情况下执行此操作。
最佳答案
我了解 Unity,但我相信您的问题是普遍性的,并且与所有 DI 系统相关。 大多数 DI 工具都可以明确命名您的依赖项。如果您要实现相同的接口(interface),这将特别有用。
所以我相信你的问题与其说是依赖的循环性(如果有这样的词的话),不如说是它的多重性。因此,我将明确命名依赖项如下:
windsor.Register(
Component
.For<IService>()
.ImplementedBy<CompositeService>("CompositeService"),
Component
.For<IService>()
.ImplementedBy<ConcreteService1>("ConcreteService1"),
Component
.For<IService>()
.ImplementedBy<ConcreteService2>("ConcreteService2")
);
但我看不出您的 DI 框架如何处理您的 CompositeService 的构造函数。 params
是一个艰难的。
这是我会做的:
1) 我删除了参数 2) 我将构造函数更改为 IEnumerable<IService> decoratedServices
3) 我创建了另一个类并实现了 IEnumerable,它只是一个工厂,它将返回给我已定义类型的列表,我使用它们的名称对其进行了初始化。
关于c# - 如何使用 CaSTLe Windsor 的 CollectionResolver 避免循环行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3734371/