有没有办法在仍然在ConfigureServices()中访问强类型设置?

时间:2017-04-04 15:37:43

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

我在Startup.cs中有类似的代码

services.Configure<AppSettings>(
    Configuration.GetSection("AppSettings"));

services.AddScoped<IMyService, MyService>();
services.AddScoped((_) => MyFactory.Create(
    Configuration["AppSettings:Setting1"],
    Configuration["AppSettings:Setting2"],
    Configuration["AppSettings:Setting3"]));

我想将AppSettings的实例传递给MyFactory.Create()。这样的实例是否可用?有没有办法获得它的实例?

我想消除当前代码中的冗余,并利用我的AppSettings类的一些好处(例如,它有一些默认值和一些方便的只读属性,是其他函数的功能属性)。

它可能看起来像这样:

services.Configure<AppSettings>(
    Configuration.GetSection("AppSettings"));

var appSettings = ???;
services.AddScoped<IMyService, MyService>();
services.AddScoped((_) => MyFactory.Create(appSettings));

取代&#34; ???&#34;?

1 个答案:

答案 0 :(得分:2)

您可以使用Microsoft.Extensions.Configuration.Binder包。这在Bind接口上提供了IConfigurationSection扩展方法,并允许您传入选项类的实例。它将尝试以递归方式将配置值绑定到类属性。

引用文档:

  

尝试通过递归地将属性名称与配置键匹配来将给定对象实例绑定到配置值。

在您的情况下,代码如下所示:

// Create a new, empty instance of AppSettings
var appSettings = new AppSettings(); 

// Bind values from the 'AppSettings' section to the instance
Configuration.GetSection("AppSettings").Bind(appSettings);

请记住,如果您仍希望通过依赖注入在应用程序中注入IOptions<AppSettings>,则仍需要通过

配置选项
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));