有时需要在ActioFilter
中使用依赖注入,或者在操作API之前或之后运行的其他属性或结果是不可避免的。但是,它是通过使用typeof
关键字将要注入的类型传递给属性来执行的。为了简化这种情况,当对接口进行各种实现时,我发现手动实例化类型要比使用内置依赖注入框架简单得多。例如:
public TestAttribute: Attribute, IActionFilter {
private Type injectionType;
public TestAttribute(Type injectionType){
...
}
...
public void OnActionExecuting(ActionExecutingContext context) {
InjectedTypeInterface injectedTypInterface = (InjectedTypeInterface) Activator.CreateInstance(injectedType, arg1, arg2, ...);
...
}
}
我想知道,从其他人的角度来看,这种方法会导致使用内置依赖注入框架的问题吗? (在这种情况下,注入的实现将总是瞬态,而不是Scoped或Singleton)
答案 0 :(得分:2)
我不建议做Activator.CreateInstance
的路线,这里有一些理由可以避免它并坚持官方方式:
IDisposable
接口时发生)而是被处置在未来某个不确定的时间,当GC开始并且将保持资源开放时间超过预期时(即保持连接或文件句柄打开的时间更长),除非您明确处置它对于您的具体示例,有更简单的方法从DI获取特定实例 - 除了官方支持的方式(Filters - Dependency Injection) - 您也可以从HttpContext
解决,假设您有权访问它在您使用的过滤器类型中。
适用于ActionFilter
/ IActionFilter
public void OnActionExecuting(ActionExecutingContext context) {
InjectedTypeInterface injectedTypInterface = context.HttpContext
.RequestServices.GetService<InjectedTypeInterface>();
...
}