首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SOLID & EventAggregator

SOLID & EventAggregator
EN

Stack Overflow用户
提问于 2014-04-28 12:59:40
回答 2查看 208关注 0票数 3

我正在尽我所能地追求稳定,在棱镜应用程序中工作时,我面临着以下问题:

我有一个类来处理模块从其他模块接收到的所有事件。由于类有两种责任(注册处理程序和处理事件),所以我决定将类分成两部分,这导致我将事件处理程序公之于众(无论如何,这似乎很奇怪)。

在这种情况下,您希望在一个类中有两个责任,或者事件处理程序是公开的(或者其他我遗漏的东西)?

致以问候。

编辑:

代码语言:javascript
复制
public class Handler
{
    public void MethodHandlingAggregatedEvent()
    {
    }
}

public class Register
{
    .... 

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

回答 2

Stack Overflow用户

发布于 2014-04-28 13:29:34

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

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

还请考虑SOLID的以下方面(来自维基百科)

单责任原则:类应该只有一个责任(也就是说,软件规范中的一个潜在更改应该能够影响类的规范) 接口隔离原理:“许多特定于客户端的接口都优于一个通用接口。”

映射到此示例时所描述的功能的要求如下:

  1. 事件A的寄存器处理程序
  2. 事件B的寄存器处理程序
  3. 处理事件A
  4. 处理事件B

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

那么现在呢?把每一件事分开都会产生四个类别,因为这些显然都是不同的责任。维基百科( Wikipedia )认为,简单地扩展和修改现有代码是可靠的原则;因此,它应该能让你的生活变得更容易,而不是更困难。

如果创建四个类,则必须将事件处理程序代码打开到在其中创建的类之外的作用域。在我看来,保留事件处理代码以及尽可能小范围内的注册将是一个更好的选择:

代码语言:javascript
复制
class MyHandler
{
    public MyHandler(IEventAggregator eventAggregator)
    {
        eventAggregator.GetEvent<EventA>().Register(HandleEventA);
    }

    private void HandleEventA(EventArgs args)
    {

    }
}

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

票数 3
EN

Stack Overflow用户

发布于 2016-04-18 14:21:19

我觉得你的设计基本上没问题。

  1. Register负责事件处理程序映射。
  2. 每个处理程序负责处理具体事件。

我建议将方法RegisterHandler()重命名为RegisterHandlers(),以反映它的行为。还使所有类实现接口。因此,您可以在单元测试中像这样模拟它们:

代码语言:javascript
复制
_registerMock.Verify(x => x.RegisterHandlers(), Times.Once);

_eventAggregator.Invoke(SomeEvent);
_someHandler.Verify(x => x.MethodHandlingAggregatedEvent(), Times.Once);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23341833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档