与Castle Windsor一起实施“复合模式”

时间:2013-07-18 14:41:47

标签: c# design-patterns dependency-injection castle-windsor

我有一个界面

  public interface IMessageHandler
  {
     void ProcessMessage(CanonicalModelEntityMessage message); 
  }

我有一些具有这种模式的具体处理程序

public class ThingMessageHandler : IMessageHandler
{
    public void ProcessMessage(Message queueMessage){
      //HandleMessage
   }
}

我还有一个'复合'对象

public class MessageHandler : IMessageHandler
{
    private List<IMessageHandler> _handlers;
    public MessageHandler()
    {
        _handlers =new List<IMessageHandler>();
    }
    public void Handle(CanonicalModelEntityMessage message)
    {
        foreach (var messageHandler in _handlers)
        {
            messageHandler.Handle(message);
        }
    }

    public void Add(IMessageHandler messageHandler)
    {
        _handlers.Add(messageHandler);
    }
}

每个处理程序都可以看到每条消息。

我相信有一种方法可以与Castle连接,所以当添加更多处理程序时,它将“正常工作”。 你能帮我解决一下我需要的代码变化,以及安装程序的外观吗?

1 个答案:

答案 0 :(得分:1)

听起来你正在尝试做一个事件发布者/聚合器。

网上有几个这样的实现,这是一个技巧:

Event publisher

  • 文章底部的代码。该代码适用于2.5,在注释中修复了3.1+。

Castle有一个强大的机制,它将根据约定注册类型Docs here。上面的文章利用这个,自动连接任何实现所需接口的类型。

另外,附注: 如果要注入实现合同(接口)的所有类,则必须使用城堡windsor Example of registering a sub resolver注册行为,并且可以找到更多信息enter link description here

希望这有帮助