.net - SOLID 和事件聚合器

标签 .net events prism solid-principles eventaggregator

我尽可能多地遵循 SOLID,但在 Prism 应用程序中工作时遇到以下问题:

我有一个类可以处理模块从其他模块接收到的所有事件。由于该类有两个职责(注册处理程序和处理事件),我决定将类一分为二,这导致我将事件处理程序公开(无论如何看起来很奇怪)。

在这种情况下,您更喜欢什么,是在一个类中承担两项职责,还是公开事件处理程序(或我遗漏的任何其他内容)?

问候。

编辑:

public class Handler
{
    public void MethodHandlingAggregatedEvent()
    {
    }
}

public class Register
{
    .... 

    public void RegisterHandler()
    {
        this.eventAggregator.GetEvent<XXX>().Subscribe(this.handler.MethodHandlingAggregatedEvent);
    }
}

最佳答案

为了更好地解释我的回答,请考虑以下示例:

  • Prism 应用程序包含 ModuleXModuleY
  • EventAEventB 定义在两个模块都可以访问它们的地方。
  • ModuleX 包含两个事件的事件处理程序。
  • ModuleY 触发这些事件。

还要考虑 SOLID 的以下方面(来自 Wikipedia )

Single responsibility principle: a class should have only a single responsibility (i.e. only one potential change in the software's specification should be able to affect the specification of the class)

Interface segregation principle: “many client-specific interfaces are better than one general-purpose interface.”[4]

当映射到此示例时,您描述的功能要求是:

  1. 为事件 A 注册处理程序
  2. 为事件 B 注册处理程序
  3. 处理事件 A
  4. 处理事件 B

如果您有一个类同时处理 A 和 B,那么您将违反单一职责原则。如果您使用在同一类中定义的处理程序注册事件处理程序,您也会违反单一职责原则。

那现在呢?拆分所有内容将产生四个类,因为这些显然都是不同的职责。根据维基百科,SOLID 原则的存在是为了简化现有代码的扩展和修改;因此,它应该让您的生活更轻松,而不是更艰难。

如果我们创建四个类,我们就被迫将事件处理程序代码开放到创建它的类之外的范围。在我看来,保留事件处理代码以及在尽可能小的范围内注册:

class MyHandler
{
    public MyHandler(IEventAggregator eventAggregator)
    {
        eventAggregator.GetEvent<EventA>().Register(HandleEventA);
    }

    private void HandleEventA(EventArgs args)
    {

    }
}

MyHandler 现在负责处理 EventA。即使它也在注册处理程序;人们可能仍然认为这是事件处理程序的一部分。

关于.net - SOLID 和事件聚合器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23341833/

相关文章:

.net - .Net 2.0/3.5/4.0 中的 Windows 窗体实现有何区别?

c# - .net mvc4 HttpPost 空值

c# - 如何确定我的应用程序的控制台窗口何时获得或失去焦点?

java - MouseDragged 有效或 mouseMoved 有效,但不能同时有效

c# - Prism EventAggregator 异常 - 必须在 UI 线程上构造

.net - web.config中的httpHelpPageUrl不起作用

javascript - 无法将 svg 元素附加到 svg 根

javascript - D3.js:在不同图表中触发事件

Prism WPF 应用程序中的本地化

c# - CAB 与 Prism 的比较