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

时间:2015-10-13 04:59:55

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

现在我希望能够得到一个&#34;很多&#34;的实例。来自温莎集装箱 但遇到了一些问题:

  • 如果所有ILoggers都在容器中,我怎样才能确保我得到&#34;很多&#34;实施而不是&#34; A&#34;或&#34; B&#34;

  • 我尝试过这个例子 Castle Windsor: How do I inject all implementations of interface into a ctor? 并使用container.Kernel.Resolver.AddSubResolver(new CollectionResolver(container.Kernel)); 注册具有IEnumerable依赖性的类但是如果 该类还实现了IComponent,不会创建循环 依赖?

我尝试的甚至可能吗?

2 个答案:

答案 0 :(得分:4)

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

在你的情况下,你在Castle Windsor的方式应该是这样的

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

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

有关在温莎城堡中注册不同模式的更多信息,请访问here

答案 1 :(得分:0)

是否可以在容器注册中使用工厂方法?

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

更改后:

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

对温莎集装箱的了解有限,我可能会对使用工厂初始化物体的相同方面进行改进。重要的是配置在容器内(即使它有点冗长)