2015-01-02 55 views
2

我正在开发使用asp.net的MVC 5.使用事件委托的多租户Web应用程序

多租户的n层Web应用程序在我的服务层,我定义自定义事件,每一个重要的行动,提高这些事件一旦这些行动被执行。例如,

Public event EventHandler EntityCreated; 

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

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

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

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

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

+0

我的解决方案,它听起来就像你需要一个发布 - 订阅系统。这些不会为你做。 –

+0

如果它们在您的应用程序中对您有用,请使用它们。如果他们不是,那么不要。如果不了解你的应用程序,我们不可能告诉你它们是否有用。 – Servy

+0

@Yash谁订阅这些活动?如果创建了新实体,您是否打算通知所有其他浏览器? – Win

回答

0

我已经实施了Udi Dahan的实现,正如@Imran所指出的那样,但有一些变化。

我的事件正在服务层中引发,因此使用Static Class dint似乎是正确的。也增加了对异步/等待的支持。

同时也会下降事件&代表路径确实有效,但它只是感觉像每个请求注册事件的开销。

我已经在博客这里http://www.teknorix.com/event-driven-programming-in-asp-net

2

正如其他人指出,酒吧/小巴或公交车是一个解决方案。另一种解决方案就像你在这里尝试做的事情,但使它更正式。

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

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

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

+0

所以这只是一个没有使用事件或代表的模式?任何为什么不使用c#事件的原因?正如你所说,我打算将EventHandlerService分成更小的类,这些类只处理一个域服务,例如CustomerService将公开事件,而CustomerServiceEventHandler将订阅这些事件。 – Yashvit

+0

那么,你当然可以使用你正在尝试做的事情。我的观点是,我成功地在生产应用程序中使用了上述模式,并支持在单独的处理程序类中使用依赖注入,因此使它们易于进行单元测试。如果你能以任何模式克服障碍,那当然应该是你的第一选择。如果没有,你至少有一个很好的选择。 –

+0

就依赖注入而言,我相信我可以让它与我的方法一起工作。我想更多地了解我的方法有多好或多坏。我没有看到很多在asp.net中使用事件和委托的例子,所以很担心。每个请求生命周期注册事件是否是一个非常大的开销?有没有办法在每次应用程序启动时注册一次? – Yashvit