C#、温莎城堡和复合设计模式

Posted

技术标签:

【中文标题】C#、温莎城堡和复合设计模式【英文标题】:C#, Castle Windsor and The Composite design pattern 【发布时间】:2015-10-13 04:59:54 【问题描述】:

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

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

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

如果所有 ILogger 都在容器中,我如何确保获得“Many”实现而不是“A”或“B”?

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

我正在尝试的可能吗?

【问题讨论】:

【参考方案1】:

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

在你的情况下,你在温莎城堡的做法应该是这样的

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。

【讨论】:

【参考方案2】:

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

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

对 Windsor Container 的了解有限,这让我想到了这一点,这可能与使用工厂初始化对象的方式相同。重要的是配置在容器内(即使有点冗长)

【讨论】:

以上是关于C#、温莎城堡和复合设计模式的主要内容,如果未能解决你的问题,请参考以下文章

温莎城堡作为英国王室的千年家族城堡,是如何建成的呢?

温莎古堡的介绍

比较温莎城堡、Unity 和 StructureMap

想在中世纪城堡里当贵族?到欧洲来场建筑巡礼

谁能介绍一下温莎古堡?

温莎古堡是啥时期的建筑呢