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

本文关键字:事件 应用程序 Web | 更新日期: 2023-09-27 18:35:52

我正在使用 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 请求进行。那么定义这些事件是开销吗?

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

正如其他人指出的那样,发布/订阅或事件总线是一种解决方案。另一种解决方案类似于您在这里尝试做的事情,但使其更加正式。

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

引发 CustomerCreated 事件时,应在代码中的某个位置处理它,以便它可以执行所需的操作。你可以使用你提到的EventHandlerService(但这很快就会涉及太多的事件)或使用Udi Dahan谈到的模式。我已经成功地将 Udi 的方法与许多 DI 容器一起使用,该模式的美妙之处在于您的类保持 SRP 兼容。您只需要在应用程序引导时使用反射实现特定的接口和注册码。

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

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

我的事件是在服务层中引发的,为此使用静态类似乎是正确的。还添加了对异步/等待的支持。

沿着事件和代表路径走下去也确实奏效了,但感觉像是为每个请求注册事件的开销。

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