注入自定义配置的正确方法

时间:2018-06-25 05:26:36

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

要解决的问题: 这里有一个设置列表,可以说:

{
   "Kind1":
     {"attr1":"val11"},
     {"attr2":"val12"},
   "Kind2":
     {"attr1":"val21"},
     {"attr2":"val22"},       
}

和.NET Core 2.1中的使用者类(控制器),需要访问以上配置才能使用Kind1或Kind2。

假设已经在C#中定义了相应的类:

 public class KindSetting
 {
    public string attr1{get;set;}
    public string attr2{get;set;}
 }

现在,将配置注入使用者对象的最佳方法是什么。

是否可以将IConfiguration实例注入使用者对象并像这样使用它?

KindSetting kindSetting =_configuration.GetValue<KindSetting>(kindSettingKey);

是否有更好的方法来满足上述要求?

3 个答案:

答案 0 :(得分:1)

在startup.com文件中,可以使用configureservices方法进行配置。下面的示例代码:

   // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        //Need to add following linse
        services.Configure<KindSetting>(Configuration.GetSection("Kind1"));
     }

添加到服务中后,您可以将此配置注入您的类中,如下所示:

public class HomeController : Controller
{

    private readonly IOptions<KindSetting> _KindSetting;

    public HomeController(IOptions<KindSetting> KindSetting)
    {
        _KindSetting = KindSetting
    }

    public void myFunction()
    {
            var mysetting = _KindSetting.Value.attr1
    }
}

答案 1 :(得分:0)

我使用了以下方法,但是我不确定是最好的方法

在启动类配置方法中:

            services.Configure<List<KindSetting>>(Configuration.GetSection("KindSettingList"));

以及在消费者对象方面:

   public ConsumerController(IOptions<List<KindSetting>> kindSettingsListAccessor,...)

答案 2 :(得分:-2)

添加MainPanel之后,您可以通过将DI添加到构造函数中来注入配置。

services.Configure<KindSettings>

IOptionsSnapshot<KindSettings> kindSettingsConfiguration

区别在于,IOptions<KindSettings> kindSettingsConfiguration 将反映配置文件中的实时更改,而IOptionsSnapshot仅用于单例使用。

评论后编辑:

可以说您的配置文件如下:

IOptions

要成功绑定它,您将需要两个配置类

{
  "Kind1":
    {"attr1":"val11"},
    {"attr2":"val12"},
  "Kind2":
    {"attr1":"val21"},
    {"attr2":"val22"},       
}

并且如前所述,只需添加点即可连接点

public class Kind1Configuration
{
    public string Attr1 { get; set; }
    public string Attr2 { get; set; }
}

public class Kind2Configuration
{
    public string Attr1 { get; set; }
    public string Attr2 { get; set; }
}

要在控制器中使用它,请将IOptions添加到构造函数中

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<Kind1Configuration>(Configuration.GetSection("Kind1"));

    services.Configure<Kind2Configuration>(Configuration.GetSection("Kind2"));
}

希望有帮助。