2017-04-27 664 views
6

ServiceFilter我们必须在Startup.cs中注册。 TypeFilter是由Microsoft.Extensions.DependencyInjection.ObjectFactory注入的,我们不需要注册那个过滤器。ServiceFilter和TypeFilter - 注入这些过滤器有什么区别?

那么当我们应该使用ServiceFilter和TypeFilter时呢?

+0

ASP.NET核心文档包含过滤器的详细说明。你检查过了吗? –

回答

5

好了,所以documentation

  • ServiceFilter检索来自DI过滤器的一个实例。使用ServiceFilter而不注册过滤器类型会导致异常。

  • TypeFilterAttribute非常类似于ServiceFilterAttribute(和还实现IFilterFactory),但其类型不从DI容器直接解决。相反,它使用Microsoft.Extensions.DependencyInjection.ObjectFactory实例化类型。

由于存在这种差异,即使用TypeFilterAttribute不需要引用类型,以与容器第一进行登记(但他们仍然会已经由容器履行依赖)。

+0

我知道 - 但我仍然没有看到何时应该使用ServiceFilter,何时使用Typefilter。 – MrChudz

+0

那么究竟是什么'Microsoft.Extensions.DependencyInjection.ObjectFactory'?如果您没有在容器中注册它,它将如何工作? –

2

ServiceFilter和TypeFilter都是使用依赖注入构造的。

根据this的TypeFilter使用Microsoft.Extensions.DependencyInjection.ObjectFactory这最终使您可以提供参数的构造函数实例化自己的(你可以看到它的构造函数的参数参数)。它也解决了你不提供的。

所以,你可以做这样的事情:

public class AttachMetadataAttribute : Attribute, IAsyncActionFilter 
{ 
    public AttachMetadataAttribute(SomeType someValue, ISomeService service) 
     { 
     } 
} 

而且你可以使用这样的:

[TypeFilter(typeof(AttachMetadataAttribute), 
    IsReusable = true, 
    Order = 10, 
    Arguments = new object[] { someValue})] 

所以在这里,由您和服务提供的第一个参数(someValue中)被容器注入。

注意:小心约IsReusable。如果设置为true,则只会创建一次注入的服务。