Dependency injection `ActionFilter`中的依赖项注入与调用`Activator.CreateInstance()中的依赖项注入`
有时需要在Dependency injection `ActionFilter`中的依赖项注入与调用`Activator.CreateInstance()中的依赖项注入`,dependency-injection,asp.net-core,asp.net-core-mvc,Dependency Injection,Asp.net Core,Asp.net Core Mvc,有时需要在ActioFilter中使用依赖项注入,或者在操作API或结果之前或之后运行的其他属性,这是不可避免的。但是,它是通过使用typeof关键字将要注入的类型传递到属性来执行的。为了简化这种情况,当一个接口有各种实现时,我发现手动实例化该类型要比使用内置的依赖注入框架简单得多。例如: public TestAttribute: Attribute, IActionFilter { private Type injectionType; public TestAttribute(
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, ...);
...
}
}
我想知道,从这里其他人的角度来看,这种方法会不会导致使用内置依赖注入框架不会造成的问题?(在这种情况下,注入的实现将始终是暂时的,而不是作用域或单例)我不建议使用
Activator.CreateInstance
的方法,以下是避免使用它并坚持使用官方方法的一些原因:
IDisposable
接口时发生),而是在将来某个不确定的时间被释放,当GC启动时,资源将保持比预期时间更长的开放时间(即,保持连接或文件句柄打开的时间比预期的时间长),除非您明确地处理它HttpContext
解析,前提是您可以在您使用的过滤器类型中访问它
对于ActionFilter
/IActionFilter
public void OnActionExecuting(ActionExecutingContext context) {
InjectedTypeInterface injectedTypInterface = context.HttpContext
.RequestServices.GetService<InjectedTypeInterface>();
...
}
public void OnActionExecuting(ActionExecutingContext上下文){
InjectedTypeInterface InjectedTypeInterface=context.HttpContext
.RequestServices.GetService();
...
}
我不建议使用Activator.CreateInstance
的路径,以下是避免使用它并坚持使用官方方式的一些原因:
IDisposable
接口时才会发生这种情况)在请求结束时,而不是在将来某个不确定的时间处理,当GC启动时,将使资源保持比预期时间更长的打开状态(即,保持连接或文件句柄的打开状态比预期时间更长),除非您显式地处理它HttpContext
解析,前提是您可以在您使用的过滤器类型中访问它
对于ActionFilter
/IActionFilter
public void OnActionExecuting(ActionExecutingContext context) {
InjectedTypeInterface injectedTypInterface = context.HttpContext
.RequestServices.GetService<InjectedTypeInterface>();
...
}
public void OnActionExecuting(ActionExecutingContext上下文){
InjectedTypeInterface InjectedTypeInterface=context.HttpContext
.RequestServices.GetService();
...
}
好吧,关于你的答案,最令人惊讶的部分是数字2。因为我真的没有意识到。如果我使用块实现I disposable并在中使用它,你认为如何。第一个问题对我来说不是问题,因为我需要手动将参数传递给构造函数,而这无法使用DI完成。是否有任何参数依赖于来自DI的cies?如果是这样,使用工厂模式可能是更好的解决方案。然后您可以将依赖项注入工厂,并使用方法public T Create(string param1,int param2)
。它仍然没有被跟踪(但它的依赖项是)。另外,如果参数是属性属性,您可以使用上面提到的TypeFilter
。如果它们是动态的,那么前面提到的工厂模式我尝试使用DI,但在内置框架中似乎不可能。因为,注入到过滤器的类型因操作而异,我无法像在。共享您的代码。您肯定能够使用DI,并在请求范围内的筛选器之间获得相同的注入服务(假设有问题的服务是使用作用域生存期添加到DI的)。您是否尝试过文档中显示的TypeFilter子类型?嗯,您的答案中最令人惊讶的部分是数字2。因为我真的没有意识到。如果我使用
块实现I disposable并在中使用它,您认为如何。第一个对我来说没有问题,因为我需要手动将参数传递给构造函数,这是不可能的使用DI完成。是否有任何参数依赖于DI?如果是,使用工厂模式可能是更好的解决方案。然后可以将依赖项注入工厂,并使用方法public T Create(string param1,int param2)
。它仍然没有被跟踪(但它的依赖项是)。另外,如果参数是属性属性,您可以使用上面提到的TypeFilter
。如果它们是动态的,那么前面提到的工厂模式我尝试使用DI,但在内置框架中似乎不可能。因为,注入到过滤器的类型因操作而异,我无法像在。共享您的代码。您肯定能够使用DI并在请求范围内的过滤器之间获得相同的注入服务(假设服务