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

标签 c# asp.net-core dependency-injection .net-core

我有一个服务类 (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/

相关文章:

c# - 在 Excel 2003 中使用 WCF?

c# - 使用 Windows 服务截屏

c# - 如何捕获 DbUpdateException 唯一异常?

c# - 如何使用 .net core 中组件的特定实例或另一个装饰器对象解析装饰器

c# - 如何将 mvc 数据注释与自动生成的 linqtosql 类结合使用

c# - 这个 ListBox 的枚举器在哪里被循环修改?

mysql - 如何在 ASP.NET 5 中将 Entity Framework 6 与 MySQL 一起使用?

javascript - 如何从 CSHTML.CS 页面操作 DOM?

android - Roboguice 和模拟 : How to have roboguice inject a mock service when testing but use the REAL otherwise?

http - 如何使用 angular2/http 进行 ajax 调用?