ServiceFilter我们必须在Startup.cs中注册。 TypeFilter是由Microsoft.Extensions.DependencyInjection.ObjectFactory注入的,我们不需要注册那个过滤器。ServiceFilter和TypeFilter - 注入这些过滤器有什么区别?
那么当我们应该使用ServiceFilter和TypeFilter时呢?
ServiceFilter我们必须在Startup.cs中注册。 TypeFilter是由Microsoft.Extensions.DependencyInjection.ObjectFactory注入的,我们不需要注册那个过滤器。ServiceFilter和TypeFilter - 注入这些过滤器有什么区别?
那么当我们应该使用ServiceFilter和TypeFilter时呢?
好了,所以documentation:
甲
ServiceFilter
检索来自DI过滤器的一个实例。使用ServiceFilter
而不注册过滤器类型会导致异常。
TypeFilterAttribute
非常类似于ServiceFilterAttribute
(和还实现IFilterFactory),但其类型不从DI容器直接解决。相反,它使用Microsoft.Extensions.DependencyInjection.ObjectFactory
实例化类型。由于存在这种差异,即使用
TypeFilterAttribute
不需要引用类型,以与容器第一进行登记(但他们仍然会已经由容器履行依赖)。
我知道 - 但我仍然没有看到何时应该使用ServiceFilter,何时使用Typefilter。 – MrChudz
那么究竟是什么'Microsoft.Extensions.DependencyInjection.ObjectFactory'?如果您没有在容器中注册它,它将如何工作? –
如果您的过滤器具有需要从容器中解析的依赖项,请使用TypeFilterAttribute
。它允许你to perform constructor injection。
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,则只会创建一次注入的服务。
ASP.NET核心文档包含过滤器的详细说明。你检查过了吗? –