【问题标题】:Message publishing based programming?基于消息发布的编程?
【发布时间】:2011-08-15 18:50:47
【问题描述】:

自从了解了使用事件聚合器发布消息而不是使用事件后,我已经设法处理了我的代码中的大多数事件(减去那些将 WPF 控件属性连接到我的代码的事件)。现在的问题是,我似乎真的用处理程序超载了我的服务。在 GitHub 上闲逛,我可以看到人们实现了事件聚合器(似乎采用了另一个名称,例如总线)并创建了一个类来处理每种类型的消息。

例如:

public class SomeHandler : IHandle<SomeMessage>
{
    private readonly IEventAggregator _eventAggregator;

    public SomeHandler(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        _eventAggregator.Subscribe(this);
    }

    public void Handle(SomeMessage message)
    {
        Console.WriteLine("Handled SomeMessage.");
    }
}

这种类型的编程使用的术语是什么?我想了解更多。

【问题讨论】:

标签: c# publish-subscribe eventaggregator


【解决方案1】:

专门基于经典的Mediator Pattern

使用中介者模式,对象之间的通信被封装在中介者对象中。对象不再直接相互通信,而是通过中介进行通信。这减少了通信对象之间的依赖关系,从而降低了耦合度。

您的具体代码示例似乎正在使用Caliburn Micro's EventAggregator。中介者模式的许多当前实现被称为“事件聚合器”,并且是MVVM Pattern 库中的常见组件。这是一种消息传递模式。

就消息传递模式而言,应该对以下书籍感兴趣:

Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions

虽然它更多的是使用消息传递来进行系统集成,而不是使用消息传递来解耦应用程序中的组件。

【讨论】:

    【解决方案2】:

    我宁愿称它为pub/subscribe

    更现代一点的方法是使用控制反转容器来获取消息的所有订阅者。

    var subscribers = _container.ResolveAll<ISubscriberOf<IMyMessage>>();
    foreach (var subscriber in subscribers)
    {
        subscriber.Handle(myMessage);
    }
    

    你也可以谷歌“event driven architecture”找到更多有趣的实现

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 2022-11-18
      • 1970-01-01
      • 2011-05-11
      • 2022-11-04
      相关资源
      最近更新 更多