Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在web应用程序中的何处以及如何使用拦截器?_C#_.net_Asp.net Mvc_Inversion Of Control_Interceptor - Fatal编程技术网

C# 在web应用程序中的何处以及如何使用拦截器?

C# 在web应用程序中的何处以及如何使用拦截器?,c#,.net,asp.net-mvc,inversion-of-control,interceptor,C#,.net,Asp.net Mvc,Inversion Of Control,Interceptor,最近我对拦截器的概念很感兴趣。我知道这个概念在很多库中都有使用,比如NHibernate、EntityFramework和其他库。但我对如何在ASP.NET MVC web应用程序中使用这个概念感兴趣 在Mvc Web应用程序中使用它在哪里有用 有没有使用拦截器的开源Asp.NETMVC项目 Asp.net Mvc已经支持一种带有过滤器的控制器拦截器。使用过滤器而不是拦截器更好吗 我想说,您使用更通用的DI容器来注入依赖项。这不仅将依赖项注入控制器,还服务于这些依赖项的依赖项,从而生成所有依赖项

最近我对拦截器的概念很感兴趣。我知道这个概念在很多库中都有使用,比如NHibernate、EntityFramework和其他库。但我对如何在ASP.NET MVC web应用程序中使用这个概念感兴趣

在Mvc Web应用程序中使用它在哪里有用

有没有使用拦截器的开源Asp.NETMVC项目


Asp.net Mvc已经支持一种带有过滤器的控制器拦截器。使用过滤器而不是拦截器更好吗

我想说,您使用更通用的DI容器来注入依赖项。这不仅将依赖项注入控制器,还服务于这些依赖项的依赖项,从而生成所有依赖项对象的完整对象图


在前端使用DI容器也为使后端更易于单元测试和松散耦合带来了很好的机会。

拦截可用于许多事情-最值得注意的是解决横切问题,如仪器、日志、审计、安全、计量等

你知道,但这很有帮助

您可以使用ASP.NET MVC过滤器来实现大致相同的效果,但是当您可以应用一个可重用的实现时,为什么要将自己限制在MVC框架中呢?

在何处/何时使用拦截器 看看您以前开发的应用程序,并检查代码。查找经常在方法和属性的开头或结尾重复的代码。这是一个代码,您可以考虑从所有这些方法移动到拦截器。例如,我注意到我的许多执行输入验证的MVC操作都使用相同的两行代码:

if (!ModelState.IsValid)
    return View(model);
这是可能被移动到拦截器(在本例中可能是MVC过滤器)的代码。编写和应用过滤器的成本是否超过了重复代码的成本?(2行代码乘以使用此命令的控制器操作数)。在这种情况下,也许不是。然而,在其他情况下,使用拦截器的好处更大

下面是一些我认为可能发生这种代码复制的情况的列表,即闻起来好像他们可以从拦截器中获益的情况:

  • 输入验证(如上所示)
  • 调试日志记录。您可以记录每个方法调用的入口和出口
  • 线程同步。您的问题是关于web应用程序,但如果您正在开发具有MVP样式视图的Windows应用程序,则可以应用拦截器,以确保所有方法调用都同步回UI线程
  • 数据库事务。我的大多数数据库事务代码如下所示:

  • PropertyChanged事件实现。此代码通常重复性很强,编写起来很烦人
  • 安全性。应用程序中可能有许多方法仅限于某些用户。这是一个过滤器
  • Web服务请求限制。某些API,例如Basecamp的API,要求您在给定的时间范围内限制一定数量的请求。如果您编写了一个Basecamp客户机类,那么可以在必要时使用
    Thread.Sleep
    对其应用拦截器,以确保所有方法调用都符合速度限制
  • 结果缓存。。您可以编写自己的拦截器来缓存UI层下各层的结果
  • WCF错误处理。如果WCF客户端处于
    故障
    状态,则无法
    处理它,因此创建和销毁客户端实例的每个方法都需要检查该状态,然后在必要时调用
    中止
    ,而不是简单地在客户端周围使用
    子句包装
    。在这种情况下,拦截器可能不是最合适的。这可能更容易
上面的例子是否适合作为拦截器的候选对象取决于应用程序独特的复杂性。当然,这份清单并非详尽无遗,也不可能详尽无遗。拦截器的可能应用程序与您编写的应用程序一样多种多样

如何使用拦截器 我可以想到三个主要的应用拦截器的地方:控制器、服务和域对象

  • 有了MVC控制器,继续使用最有意义
  • 对于要从IoC容器中取出的中间层服务,过滤器不是选项(因为它不是控制器),因此您应该使用
  • 对于通常使用构造函数直接实例化的域对象(如果是新实体)或从所选的ORM获取的域对象(如果是现有实体),您需要使用某种对象工厂来代替构造函数和对象工厂

关于如何完成所有这一切的具体细节将取决于您使用的工具。

我想让您看看依赖注入,因为它是一个更常用的术语,用于描述您所寻找的功能。@thekip-我知道这一点。所以我为它添加了ioc标签。听起来你可能在寻找。我不知道截取器不能提供与DI容器相反的任何功能?我的问题中没有打算纯粹使用没有DI容器的截取器。这只是含蓄的intented@thekip-依赖项注入完全按照名称所述,它为对象提供依赖项。另一方面,拦截器完全按照其名称执行,它们拦截对方法的调用。所以你可以
using (var transaction = Session.BeginTransaction())
{
    // ... do some work that is unique to this method ...
    transaction.Commit();
}