Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection `ActionFilter`中的依赖项注入与调用`Activator.CreateInstance()中的依赖项注入`_Dependency Injection_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

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启动时,资源将保持比预期时间更长的开放时间(即,保持连接或文件句柄打开的时间比预期的时间长),除非您明确地处理它
  • 正如您已经认识到的,您不能对作用域实例和单实例执行此操作
  • 对于您的具体示例,有更简单的方法从DI获取特定实例-除了官方支持的方法()-您还可以从
    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启动时,将使资源保持比预期时间更长的打开状态(即,保持连接或文件句柄的打开状态比预期时间更长),除非您显式地处理它
  • 正如您已经认识到的,您不能对作用域实例和单实例执行此操作
  • 对于您的具体示例,有更简单的方法从DI获取特定实例-除了官方支持的方法()-您还可以从
    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并在请求范围内的过滤器之间获得相同的注入服务(假设服务