[英]Where and how to use interceptors in web application?
我最近对拦截器概念很感兴趣。 我知道这个概念被用于许多库,如 NHibernate、Entity Framework 等。 但我对如何在 ASP.NET MVC web 应用程序中使用这个概念很感兴趣。
在 Mvc Web 应用程序中使用它在哪里有用?
是否有任何使用拦截器的开源 Asp.Net Mvc 项目?
Asp.net Mvc 已经支持一种带有过滤器的 controller 拦截器。 使用过滤器而不是拦截器更好吗?
查看您之前开发的应用程序并检查代码。 查找在方法和属性的开头或结尾经常重复的代码。 您可以考虑将这些代码从所有这些方法转移到拦截器中。 例如,我注意到我的许多执行输入验证的 MVC 操作都使用相同的几行代码:
if (!ModelState.IsValid)
return View(model);
这是可能被移动到拦截器(在这种情况下可能是 MVC 过滤器)的代码。 编写和应用过滤器的成本是否超过了重复代码的成本? (2 行代码乘以 controller 使用此操作的次数)。 在这种情况下,也许不是。 然而,在其他情况下,使用拦截器的好处会更大。
以下是我认为可能会发生这种类型的代码重复的一些情况的列表,即闻起来像它们可以从拦截器中受益的场景:
using (var transaction = Session.BeginTransaction())
{
// ... do some work that is unique to this method ...
transaction.Commit();
}
AuthorizeAttribute
正是对此的过滤器。Thread.Sleep
。Faulted
state 中,则您无法Dispose
它,因此创建和销毁客户端实例的每个方法都需要检查 Z9ED39E2EA931586B6A985A6942EF573Z 客户端,而不是简单地在客户端周围using
调用子句,而不是简单地包装Abort
子句。 在这种情况下,拦截器可能不是最合适的。 修复Dispose
实现或使用某种 wrapper可能更容易。上述示例是否适合拦截器取决于您的应用程序的独特复杂性。 当然,这份清单并不详尽,也不可能。 拦截器的可能应用程序与您编写的应用程序一样多种多样。
我可以想到您可能希望应用拦截器的三个主要位置:控制器、服务和域对象。
关于如何完成所有这些的细节将取决于您使用的工具。
拦截可用于许多事情——最值得注意的是解决横切问题,例如仪器、日志记录、审计、安全、计量等。
您不需要 DI 容器来应用该概念,但它会有所帮助。
您可以使用 ASP.NET MVC 过滤器来实现大致相同的效果,但是当您可以应用通常可重用的实现时,为什么还要限制自己使用 MVC 框架呢?
我会说您使用更通用的 DI 容器来注入您的依赖项。 这不仅将依赖项注入到您的 controller 中,它还提供这些依赖项的依赖项,从而生成所有依赖对象的完整 object 图。
为前端使用 DI 容器也为使您的后端更可单元测试和松耦合带来了很好的机会。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.