c# - 如何使用 CaSTLe Windsor 的 CollectionResolver 避免循环行为?

标签 c# dependency-injection inversion-of-control castle-windsor

我在我的应用程序中使用 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 组件>decoratedServices 属性。 decoratedServices 属性应包含两项: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/

相关文章:

c# - 依赖注入(inject)接线问题

c# - 在 C#.net 中使重叠的图片框透明

c# - WPF ComboBox 选择导致第二个 ComboBox 中的选择

c# - 如何在 asp.net 中显示 response.write

c# - 使用 MVC 进行依赖注入(inject)和内存中集成测试

c# - 简单注入(inject)器/IoC - 队列处理器的 Windows 服务和请求周期

c# - 是否可以在 c# 中创建一个构造函数列表来创建随机对象?

asp.net-mvc - Autofac 可以将依赖项注入(inject)到布局 View 文件中吗?

java - 从 WebListener 中的 ServerContainer 中删除端点

java - 如何使用 Dagger 2 将上下文传递给适配器?