我有一个服务类 (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>();
}
这段代码工作得很好。但是,我有以下问题:
- 从设计的角度来看,让一个选项类直接依赖于另一个服务类是个好主意吗?
- 如果是,这样做是否是一种好的做法,或者是否有更稳健和优雅的方式将选项类注入(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/