在Startup类的Configure()方法中,服务的方法注入或构造函数注入之间有区别吗?

桑德罗

根据文档,我们可以将以下服务注入启动类:

  • IWebHost环境
  • 主机环境
  • 配置

但是我们也可以使用方法注入来解决方法中的这些服务Configure()

可以在Configure方法签名中指定其他服务,例如IWebHostEnvironment,ILoggerFactory或ConfigureServices中定义的任何服务。这些服务(如果可用)将被注入。

我使用哪种注射变体会有所不同吗?

具体来说,IWebHostEnvironment在构造函数中解析然后Configure()通过私有字段方法中进行访问与将其作为方法参数注入有区别吗?

public class Startup
{
    private readonly IWebHostEnvironment env;

    public Startup(IWebHostEnvironment env)
    {
        this.env = env;
    }

    public void Configure(IApplicationBuilder app)
    {
        if (this.env.IsDevelopment())
        [...]
    }
}

public class Startup
{
    public Startup() {}

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        [...]
    }
}
国王王

一般而言,构造函数和方法DI可以是基于使用此框架但不使用其他框架的某个框架的偏好或要求。asp.net core(以及.net core通常情况下)中,建议使用构造函数注入,因为它可以清楚地说明依赖项。这比方法注入更有意义。但是,在某些情况下,您必须使用方法注入,因为依赖项只能在调用时可用方法或至少在构建类/服务时不可用。有时,注入的服务仅用于特定的方法调用,在这种情况下,将使用方法注入。在某些情况下,服务实例是单例的,但其方法调用需要某些作用域服务,因此将使用方法注入。该场景的一个示例是使用convention-based middleware基于约定的中间件是单件的,在应用程序启动时创建一次,而不是针对每个请求。因此,所有作用域服务都必须注入InvokeorInvokeAsync方法中。但是,基于工厂的中间件可以将其范围内的服务注入到构造函数中,因为它们可以按请求创建(注册为范围内或临时的)。

就像Startup上课一样。您可以将一些内置服务注入Startup的构造函数中,如IConfiguration,,IWebHostEnvironment...。通常,很多可用的服务(之前注册)ConfigureServices都可以注入Startup的构造函数中。这意味着所有注册的服务ConfigureServices 均不可注入Startup的构造函数。但是,您可以将所有注册的服务(包括内置服务和您自己的服务)注入该方法中Configure请注意,注入的服务Configure应该是单例的和瞬态的,对于作用域服务,使用它们时可能会出现问题。这实际上取决于您使用的特定服务。

以下示例显示了ConfigureServices无法将自己的服务(在中注册)注入Startup的构造函数中:

 public interface ISomeService {}
 public class SomeService : ISomeService {}


 public class Startup {
      //will not work because at this time, the ISomeService has not been registered yet
      public Startup(ISomeService someService){
          //an error will be thrown complaining about not being able to 
          //resolve the ISomeService
      }

      public void ConfigureServices(IServiceCollection services){
          //...
          services.AddSingleton<ISomeService,SomeService>();
          //...
      }
      //this works because at this time the ConfigureServices was called
      //the services container has been built with your registered ISomeService
      public void Configure(IApplicationBuilder app, ISomeService someService){
          //...
      }
 }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

构造函数与方法之间的区别

Dagger中字段和构造函数注入之间的区别

构造函数注入找不到符号方法注入成员

类构造函数内的函数和内部类但外部构造函数(在js中)之间的方法有什么区别?

用依赖注入注入普通类是个好方法吗?

这两种类型的php中的构造函数注入有什么区别?

不变构造函数注入Kotlin类的正确方法

@Inject与构造函数注入作为Angular 2中的常规参数有什么区别?

通过构造函数注入和使用Guice通过字段注释注入之间有什么区别?

Laravel自动注入和在构造函数主体中手动指定依赖项之间有什么区别?

构造函数注入与方法注入

使用方法而不是构造函数注入服务

Symfony 4服务依赖注入-构造函数与方法

构造函数依赖注入的替代方法

Angular4注入服务类-调用服务方法时构造函数中的代码未完成?

在类构造函数中注入服务的长形式

Dart类中的构造函数之间的区别

如何在父类中注入服务而不在构造函数中传递它?角度6

Laravel构造函数和方法注入

Angular中的依赖注入/从类中调用属于服务的方法

单元测试:具有构造函数依赖项注入的模拟服务类

即使类不拥有这些依赖关系,而是在方法中使用它们,您是否将依赖关系注入到构造函数中?

使用依赖注入,如何访问服务内的类中的方法?

注入类的构造函数参数

通过这种方法注入方法,并与Java中的构造函数注入方法进行了比较

构造函数注入和方法用法

如何在继承自基类需要注入服务的基类的类中编写类构造函数?

在类的构造函数中使用“this”关键字与在 C++ 中不使用它之间有区别吗

如何调用注入另一个构造函数服务PHP Symfony的方法服务