![](/img/trans.png)
[英]Asp.net Core dependency injection in filters without [ServiceFilter] or [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
还是Scoped
或Transient
。 如果其为Singleton
则仅为所有请求创建一个实例。
要记住的关键
我们要使用ServiceFilter
和Service Provider
来管理过滤器类型的生命周期。 如果过滤器具有依赖项,则我们已经像平常一样使用Service Provider
管理它。
好的,所以文档 :
ServiceFilter
从DI检索过滤器的实例。 在未注册过滤器类型的情况下使用ServiceFilter
导致异常。
TypeFilterAttribute
与ServiceFilterAttribute
非常相似(并且也实现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.