gpt4 book ai didi

c# - 将配置的选项实例注入(inject)作用域服务的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-05 02:59:25 24 4
gpt4 key购买 nike

我有一个服务类 (DynamicsConnector),它依赖于另一个选项类 (DynamicsConnectorOptions)。在依赖注入(inject)之后,我需要将 (DynamicsConnectorOptions) 注入(inject) (DynamicsConnector)。

经过几个小时的搜索,我找到了一种方法,如下面的代码所示:

    //Code snippet for target dependency injection classes
public class DynamicsConnector : IDynamicsConnector
{
DynamicsConnectorOptions options { get; set; }
public DynamicsConnector(DynamicsConnectorOptions options)
{
this.options = options;
}
}

//Code snippet for configuring and registering classes
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddOptions();

var settings = Configuration.GetSection("DynamicsConnector");
services.Configure<DynamicsConnectorOptions>(settings);

DynamicsConnectorOptions options = new DynamicsConnectorOptions();
settings.Bind(options);
services.AddScoped(x => options);
services.AddScoped<IDynamicsConnector, DynamicsConnector>();
}

这段代码工作得很好。但是,我有以下问题:

  1. 从设计的角度来看,让一个选项类直接依赖于另一个服务类是个好主意吗?
  2. 如果是,这样做是否是一种好的做法,或者是否有更稳健和优雅的方式将选项类注入(inject)另一个服务类?

最佳答案

您应该关注 options pattern :

public class DynamicsConnector : IDynamicsConnector
{
private readonly IOptions<DynamicsConnectorOptions> options { get; set; }
public DynamicsConnector(IOptions<DynamicsConnectorOptions> options)
{
this.options = options;
}
}

然后,您在 ConfigureServices 中所需要做的就是:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();

var settings = Configuration.GetSection("DynamicsConnector");
services.Configure<DynamicsConnectorOptions>(settings);
services.AddScoped<IDynamicsConnector, DynamicsConnector>();
}

您还可以选择使用其他接口(interface),如 IOptionsSnapshot,它会刷新每个范围的选项(假设它来自支持重新加载的配置提供程序,如 JSON)。

关于c# - 将配置的选项实例注入(inject)作用域服务的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57895096/

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