首页 > 解决方案 > 将一个参数传递给依赖注入类的构造函数,它也将具有依赖注入参数

问题描述

我正在将 .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.netdependency-injection

解决方案


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

  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;
    }
    

推荐阅读