【问题标题】:Pass in one argument to constructor of dependency injection class, that will also have a dependency injected argument将一个参数传递给依赖注入类的构造函数,它也将具有依赖注入参数
【发布时间】:2021-03-30 00:30:44
【问题描述】:

我正在将 .net 框架转换为 .net 5.0,并使用 .net 5.0 中的内置依赖注入,而不是我在 .net 框架中使用的 Ninject 库。

我有以下构造函数,它接受一个 messageHandler(通过依赖注入)以及一个 Web 服务根地址:

(旧)1.

public ApiConnection(HttpMessageHandler messageHandler, string webServiceRootAddress)

这是.net框架中通过ninject进行依赖注入的设置:

(旧)2.

kernel.Bind<IApiConnection>().To<ApiConnection>().InSingletonScope()
    .WithConstructorArgument(
        "webServiceRootAddress",
        ConfigurationManager.AppSettings["webServiceRootAddress"]);

(旧)3.

kernel.Bind<HttpMessageHandler>().To<HttpClientHandler>();

我想在启动文件中.net 5的内置依赖注入中设置上述内容。

我目前有以下:

(新的不起作用)4.

services.AddSingleton<IApiConnection, ApiConnection>(s =>
    new ApiConnection(Configuration.GetSection("Address")
        .GetSection("webServiceRootAddress").Value));

(新)5.

services.AddScoped<HttpMessageHandler, HttpClientHandler>();

但是上面期望 2 个参数被传递给构造函数。此处如何定义只传入一个构造函数参数,因为 HttpMessageHandler 参数将通过依赖注入(第 5 行)传入。

【问题讨论】:

    标签: c# asp.net .net dependency-injection


    【解决方案1】:

    有几个选项,这里有几个。

    1. 使用s参数获取服务:

      services.AddSingleton<IApiConnection, ApiConnection>(s => 
      {
          var rootAddress = Configuration.GetSection("Address")
              .GetSection("webServiceRootAddress")
              .Value;
          var messageHandler = s.GetRequiredService<HttpMessageHandler>();
          return new ApiConnection(messageHandler, rootAddress );
      });
      
    2. 传入一个获取根地址的服务/类:

      public class MyConfig
      {
          public string WebServiceRootAddress { get; set; }
      }
      

      将服务添加到您的 DI 容器中:

      services.Configure<MyConfig>(Configuration.GetSection("Address")
          .GetSection("webServiceRootAddress"));
      

      现在修改您的 ApiConnection 服务以使用类而不是字符串:

      public ApiConnection(HttpMessageHandler messageHandler, MyConfig myConfig)
      {
          var webServiceRootAddress = myConfig.WebServiceRootAddress;
      }
      

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多