C# 在多租户web应用程序中使用事件委托

C# 在多租户web应用程序中使用事件委托,c#,asp.net,asp.net-mvc,event-handling,C#,Asp.net,Asp.net Mvc,Event Handling,我正在使用asp.net Mvc 5开发一个多租户n层web应用程序 在我的服务层中,我为每个重要操作定义自定义事件,并在执行这些操作后引发这些事件。比如说 Public event EventHandler EntityCreated; Public void Create(Entity item) { Save(item); ...... EntityCreated(this, item); } 我打算将业务规则和通知与这些事件联系起来。我想使用事件的主要原因是,在不修改服务

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

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

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

当引发CustomerCreated事件时,应该在代码中的某个地方处理它,以便它可以执行所需的操作。您可以使用您提到的EventHandlerService(但这可能很快会涉及太多事件),或者使用前面提到的模式。我已经在许多DI容器中成功地使用了Udi的方法,这种模式的美妙之处在于您的类仍然符合SRP。您只需在应用程序引导时使用反射实现特定的接口和注册代码


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

我已经实现了Udi Dahan的实现,正如@Imran所指出的那样,但做了一些更改

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

沿着Events&Delegates路径也确实可行,但每个请求注册事件就像是一种开销


我在这里写了我的解决方案

听起来你需要一个酒吧子系统。这些不会对你有用。如果它们在你的应用程序中对你有用,那么就使用它们。如果不是,那就不要。在对您的应用程序一无所知的情况下,我们不可能告诉您它们是否有用。@Yash谁订阅了这些活动?如果创建了新实体,您是否计划通知所有其他浏览器?@win I将拥有一个EventHandlerService,它将订阅这些事件。现在,我想通过电子邮件和/或信号器通知分配给实体的用户。继续进行这些事件中的一些将需要在应用程序中执行一些工作流或自动化。因此,这只是一种不使用事件或委托的模式?为什么不使用c#事件?正如您所说,我确实打算将EventHandlerService拆分为更小的类,这些类将只处理一个域服务,例如CustomerService将公开事件,CustomerServiceEventHandler将订阅这些事件。当然,您可以按照您的尝试使用事件。我的观点是,我已经在生产应用程序中成功地使用了上述模式,并且它支持在单个处理程序类中使用依赖注入,因此使它们易于单元测试。如果你能以你正在尝试的任何模式克服障碍,那么这当然应该是你的第一选择。如果没有,至少你有一个好的选择。至于依赖注入,我相信我可以用我的方法让它工作。我想更多地了解我的方法是好是坏。我还没有在asp.net中看到很多使用事件和委托的例子,所以我很担心。在每个请求生命周期中注册事件是否会造成很大的开销?有没有办法在每次应用程序启动时注册一次?嘿@Imran,如果你能分享一些关于如何使用Udi Dahan建议的pub-sub方法的代码片段,我将不胜感激。另外,您是否设法让它与async/await一起工作?我尝试过实现它,但在IOC中失败了。我正在使用Autofac作为IOC容器。努力将IContainer注入DomainEvents静态类。