gpt4 book ai didi

c# - 依赖注入(inject) : static parameters and services

转载 作者:太空狗 更新时间:2023-10-30 01:13:30 24 4
gpt4 key购买 nike

我有这个服务将被注入(inject)到其他一些 Controller 。

它需要一个服务,以及一个从配置文件中获取的连接字符串。

public class MyService : IMyService
{
public MyService(IService1 service1, IService2 service2, string connectionString){
//...
}
}

我想注入(inject) IService1IService2,但要手动指定 connectionString。我想不出办法解决这个问题,我看到的例子要么非常复杂,要么就是不是我想要实现的。

public void ConfigureServices(IServiceCollection services)
{
var cfg = new MyConfiguration();
Configuration.Bind("config", cfg);
var connectionString = cfg["myConnectionString"];
services.AddSingleton<IMyService, MyService>(/*what can I do here?*/)
}

这可以简单地实现吗?

最佳答案

您可以访问工厂委托(delegate)中的服务提供者。

解决其他依赖,初始化服务时注入(inject)静态变量。

//...
var connectionString = cfg["myConnectionString"];
services.AddSingleton<IMyService>(_ =>
new MyService(_.GetService<IService1>(), _.GetService<IService2>(), connectionString));

在上面的例子中_在工厂委托(delegate)中是一个 IServiceProvider , 和 GetService<T>扩展方法用于解析其他服务,前提是它们也已在服务集合中注册。

工厂委托(delegate)将在第一次被调用IMyService被要求。

作为替代方案,引用 Options pattern in ASP.NET Core

假设有一个 settings.json 文件

{
"myConnectionString": "value1_from_json",
}

考虑使用 IOptions<T>由配置扩展提供。

创建一个类来存储所需的配置。

public class MyConnections {
public string MyConnectionString { get; set; }
}

重构类以依赖IOption<MyConnections>

public class MyService : IMyService {
private string connectionString;
public MyService(IService1 service1, IService2 service2, IOptions<MyConnections> options){
connectionString = options.Value.MyConnectionString;
//...
}

//...
}

启动时配置

//...

services.Configure<MyConnections>(Configuration);
services.AddSingleton<IMyService, MyService>();

关于c# - 依赖注入(inject) : static parameters and services,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50119188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com