ASP.NET中的过滤器使我感到困惑。我看过3种过滤器:
MVC过滤器System.Web.Mvc.IActionFilter
WebAPI过滤器System.Web.Http.Filters.IActionFilter
核心MVC过滤器Microsoft.AspNetCore.Mvc.Filters.IActionFilter
是否有Core WebAPI过滤器?
我有一个WebAPI过滤器,该过滤器通过构造函数参数使用依赖注入。在使用Unity作为IOC容器的WebAPI应用程序中,它运行良好。
container.Register<IMyService, MyService>();
container.Register<LogActionFilter>();
var filterInstance = container.Resolve<LogActionFilter>();
GlobalConfiguration.Configuration.Filters.Add(filterInstance);
以下属性Log
被定义为仅具有三个属性的简单属性。上面的LogActionFilter
将使用Log
检查动作是否具有GetCustomeAttribute<LogAttribute>()
属性。
[Log(Enabled=true, Level=2, Format="xxxx")]
public void MyAction()
{
}
现在,我想将其迁移到ASP.NET CORE。我可以将DI用于CORE过滤器吗?
我只能在ASPNET CORE中找到Microsoft.AspNetCore.Mvc.Filters.IActionFilter
。而且似乎很难使用DI。仍然不知道如何注册这样的过滤器。
我知道有ServiceFilter(typeof(XxxFilter))
,但是传递像[Log(Enabled=true, Level=2, Format="xxxx")]
这样的参数是不好的
有人有CORE过滤器的例子吗?
谢谢。
答案 0 :(得分:1)
TL; DR:它们几乎都是同一件事。
System.Web.Mvc.IActionFilter
是来自ASP.NET MVC的MVC操作筛选器。System.Web.Http.Filters.IActionFilter
是来自ASP.NET MVC WebAPI的MVC操作筛选器。Microsoft.AspNetCore.Mvc.Filters.IActionFilter
是来自ASP.NET Core的MVC操作筛选器。因此,共同的主题是它们都是MVC动作过滤器。这意味着它们在MVC框架的上下文中四处执行动作。
区别仅在于它们用于不同 MVC框架。
ASP.NET MVC是在.NET Framework上运行的较旧的MVC框架。 WebAPI是专门为创建Web API而开发的框架。它通常类似于ASP.NET MVC,但仍然是一个单独的实体。
使用ASP.NET Core(Microsoft最新和最新的开源MVC框架),已消除了“ MVC”和“ WebAPI”之间的区别,而您仅在ASP.NET Core中包含了一个MVC框架。因此,您只有ASP.NET Core,并且碰巧在MVC操作周围使用了操作过滤器。
ASP.NET Core有非常好的documentation on MVC filters。还有一个专门针对dependency injection in filters的部分。您可以使用ServiceFilter
或TypeFilter
在过滤器中正确使用依赖项注入。当您想从DI容器中完全解析过滤器时,可以使用ServiceFilter
,而可以使用TypeFilter
在属性中直接提供一些参数。具有讽刺意味的是,example on TypeFilter
还使用了一个日志记录示例。
话虽这么说,日志记录通常不是动作过滤器的最佳用例,因为默认情况下ASP.NET Core实际上会记录动作的执行情况。