将一个参数传递给依赖注入 class 的构造函数,该参数也将具有依赖注入参数
Pass in one argument to constructor of dependency injection class, that will also have a dependency injected argument
我正在将 .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 行)。
有几个选项,这里有几个。
使用s
参数获取服务:
services.AddSingleton<IApiConnection, ApiConnection>(s =>
{
var rootAddress = Configuration.GetSection("Address")
.GetSection("webServiceRootAddress")
.Value;
var messageHandler = s.GetRequiredService<HttpMessageHandler>();
return new ApiConnection(messageHandler, rootAddress );
});
传入一个获取根地址的service/class:
public class MyConfig
{
public string WebServiceRootAddress { get; set; }
}
将服务添加到您的 DI 容器:
services.Configure<MyConfig>(Configuration.GetSection("Address")
.GetSection("webServiceRootAddress"));
现在修改您的 ApiConnection
服务以使用 class 而不是字符串:
public ApiConnection(HttpMessageHandler messageHandler, MyConfig myConfig)
{
var webServiceRootAddress = myConfig.WebServiceRootAddress;
}
我正在将 .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 行)。
有几个选项,这里有几个。
使用
s
参数获取服务:services.AddSingleton<IApiConnection, ApiConnection>(s => { var rootAddress = Configuration.GetSection("Address") .GetSection("webServiceRootAddress") .Value; var messageHandler = s.GetRequiredService<HttpMessageHandler>(); return new ApiConnection(messageHandler, rootAddress ); });
传入一个获取根地址的service/class:
public class MyConfig { public string WebServiceRootAddress { get; set; } }
将服务添加到您的 DI 容器:
services.Configure<MyConfig>(Configuration.GetSection("Address") .GetSection("webServiceRootAddress"));
现在修改您的
ApiConnection
服务以使用 class 而不是字符串:public ApiConnection(HttpMessageHandler messageHandler, MyConfig myConfig) { var webServiceRootAddress = myConfig.WebServiceRootAddress; }