C#,Castle Windsor和复合设计模式

Mic*_*elB 5 c# design-patterns castle-windsor composite

我已经使用复合模式为几个单独的平台设计了遥测记录器

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我希望能够从Windsor容器中获取"Many"的实例,但遇到了一些问题:

  • 如果所有ILoggers都在容器中,我怎样才能确保我得到"很多"实现而不是"A"或"B"?

  • 我尝试过这个示例 Castle Windsor:如何将所有接口实现注入ctor? 并使用 container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); 注册具有IEnumerable依赖性的类,但如果该类也实现IComponent它不会创建循环依赖?

我正在尝试甚至可能吗?

Krz*_*cki 5

首先,这是复合设计模式而不是组件。

在您的情况下,您在温莎城堡中执行此操作的方式应该如下所示

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>());
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为 Castle Windsor 对 Composite 或 Decorator 等模式有内部理解,因此在这种情况下不会创建循环依赖。请记住,在这种情况下,注册顺序很重要。

有关在温莎城堡中注册不同模式的更多信息,请参见此处