繁体   English   中英

ServiceFilter和TypeFilter-注入这些过滤器有什么区别?

[英]ServiceFilter and TypeFilter - what is the difference in injection those filters?

我们必须在Serviceup.cs中注册ServiceFilter。 TypeFilter是由Microsoft.Extensions.DependencyInjection.ObjectFactory注入的,我们不需要注册该过滤器。

那么什么时候应该使用ServiceFilter和何时使用TypeFilter?

根据Pro ASP.NET Core MVC 2的书。 第19章: 过滤器 ,第615页

使用TypeFilter属性时,将为每个请求创建过滤器类的新实例。 这与将过滤器直接用作属性的行为相同,不同之处在于TypeFilter属性允许过滤器类声明通过服务提供者解析的依赖项。 ServiceFilter属性更进一步,并使用服务提供者来创建过滤器对象。 这也允许将过滤器对象置于生命周期管理下。

区别由于ServiceFilter使用ServiceProvider来解决所涉及的筛选器实例,因此您可以控制在启动类中注册的筛选器的生命周期:

services.AddSingleton<TimeFilter>();

从上面的代码行中,将仅为MVC应用程序生命周期创建一次TimeFilter (而不是为每个http请求生命周期或当客户要求时)创建一次,以便为所有http请求提供服务,而使用TypeFilter是不可能的,因为存在您无法指示MVC框架何时实例化和配置TypeFilter下使用的过滤器。

如果将过滤器注册为Singleton则仅创建该过滤器的一个实例,这意味着CLR的工作量减少,这与TypeFilter为每个http请求创建过滤器类的新实例的情况不同。

用法假设您将TypeFilter应用于两个操作方法,对于每个HTTP请求,将创建该TypeFilter的新实例,将调用构造函数并注入依赖项(您可以使用Service Provider控制依赖项的生命周期Service Provider )。 相反,使用ServiceFilter可以确定其Singleton还是ScopedTransient 如果其为Singleton则仅为所有请求创建一个实例。

要记住的关键

我们要使用ServiceFilterService Provider来管理过滤器类型的生命周期。 如果过滤器具有依赖项,则我们已经像平常一样使用Service Provider管理它。

好的,所以文档

  • ServiceFilter从DI检索过滤器的实例。 在未注册过滤器类型的情况下使用ServiceFilter导致异常。

  • TypeFilterAttributeServiceFilterAttribute非常相似(并且也实现IFilterFactory), 但是不能直接从DI容器解析其类型 而是使用Microsoft.Extensions.DependencyInjection.ObjectFactory实例化类型。

由于存在这种差异,使用TypeFilterAttribute引用的类型不需要先在容器中注册 (但它们仍将由容器来满足其依赖关系)。

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

根据对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,则注入的服务仅创建一次。

如果您的过滤器具有需要从容器中解析的依赖项,请使用TypeFilterAttribute 它允许您执行构造函数注入

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM