在多租户Web应用程序中使用事件代理

我正在使用asp.net Mvc 5开发一个多租户n层Web应用程序。

在我的服务层中,我为每个重要操作定义自定义事件,并在执行这些操作后引发这些事件。 例如

Public event EventHandler EntityCreated; Public void Create(Entity item) { Save(item); ...... EntityCreated(this, item); } 

我打算将业务规则和通知连接到这些事件。 我想要使​​用事件的主要原因是在不修改服务层的情况下解耦了更多事件处理程序的逻辑和易插拔性。

问题:在asp.net中使用事件和代理是否有意义?

我在网上找到的大多数例子都是win form或wpf。 在multithreading应用程序方面,我获得了优势。 此外, 事件每个表单定义一次,并在表单的生命周期内处于活动状态。

但在我的情况下, 事件将是每个http请求 。 这是定义这些事件的开销吗?

正如其他人指出,pub / sub或event bus是一种解决方案。 另一种解决方案就像你在这里尝试做的那样,但要使它更正式。

我们来看一个创建客户的具体例子。 您希望在应用程序中创建新客户时发送欢迎电子邮件。 域只应关注创建客户并将其保存在数据库中,而不是所有其他详细信息,如发送电子邮件。 所以你添加了一个CustomerCreated事件。 这些类型的事件称为域事件,而不是用户界面事件,如按钮单击等。

当引发CustomerCreated事件时,应该在代码中的某处处理它,以便它可以满足需要。 你可以使用你提到的EventHandlerService(但这很快就会关注太多事件)或使用Udi Dahan谈论的模式。 我已经成功地将Udi的方法与许多DI容器一起使用,并且模式的优点在于您的类仍然符合SRP标准。 您只需使用reflection在应用程序引导时实现特定的接口和注册代码。

如果您需要有关此主题的进一步帮助,请告诉我,我可以与您分享代码段以使其正常工作。

我已经实现了@Imran指出的Udi Dahan的实现,但有一些变化。

我的事件正在服务层中引发,并且使用静态类dint似乎是正确的。 还添加了对async / await的支持。

同时沿着Events&Delegates路径确实运行了,但它只是感觉像是按照请求注册事件的开销。

我在http://www.teknorix.com/event-driven-programming-in-asp-net上写了我的解决方案