在多租户 Web 应用程序中使用事件委托

Using Events Delegates in multi tenant web application

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

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

Public event EventHandler EntityCreated;

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

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

问题: 在 asp.net 中使用事件和委托有意义吗?

我在网上找到的大多数示例都是针对 win 表单或 wpf 的。在涉及多线程应用程序时,我获得了优势。此外, 事件每个表单定义一次 ,并且在表单的整个生命周期内都处于活动状态。

但在我的例子中,事件将根据 http 请求。那么定义这些事件是否是一种开销?

正如其他人指出的那样,pub/sub 或事件总线是一种解决方案。另一个解决方案与您在这里尝试做的类似,但使其更正式。

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

引发 CustomerCreated 事件时,应在代码中的某处对其进行处理,以便它可以执行必要的操作。您可以像您提到的那样使用 EventHandlerService(但这很快就会涉及太多事件)或使用 Udi Dahan 谈论的模式。我已经成功地将 Udi 的方法用于许多 DI 容器,并且该模式的美妙之处在于您的 类 仍然符合 SRP。您只需要在应用程序 bootstrap 时使用反射实现特定的接口和注册代码。

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

我已经实现了@Imran 指出的 Udi Dahan 的实现,但做了一些更改。

我的事件是在服务层中引发的,为此使用静态 Class 力似乎是正确的。还添加了对 async/await.

的支持

沿着“事件和委托”路径走下去确实可行,但感觉为每个请求注册事件是一种开销。

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