当我在孩子需要一些配置设置的嵌套类中进行嵌套时(例如,用appsettings.json编写的设置),是否需要进行存储桶中继以将配置传递给孩子类?
我认为以下示例并非明智之举.有更好的做法吗?
启动文件
public Startup(IConfiguration configuration, ...)
{
...
this.Configuration = configuration;
...
}
Parent.cs
public class Parent
{
public Parent(IConfiguration configuration)
{
_configuration = configuration;
}
private IConfiguration _configuration;
private ChildOne _childOne;
private ChildTwo _childTwo;
public void InitializeChildren()
{
_childOne = new ChildOne(_configuration);
_childTwo = new ChildTwo(_configuration);
}
}
ChildOne.cs
public class ChildOne{
public ChildOne(IConfiguration configuration){
_propOne = configuration.GetSection("brahbrah").Value;
}
private string _propOne;
}
解决方法:
域对象/模型只不过是数据容器.这些数据容器可能需要数据,但不应依赖于(直接)对此数据进行依赖注入,因为它们是应用程序的核心.模型中的更改(或其依赖性)很可能会导致更大的更改.
如示例所示,您想使用new运算符实例化模型并将IConfiguration作为参数传递.通过在数据容器中要求IConfiguration,您将创建一种情况,您的模型将需要大量检查返回的结果是否存在以及其中的每个属性是否存在,然后在数据容器中设置适当的值.
解决此问题的更好方法是在依赖项注入框架中注册专用的config类,我们将其称为BrahBrahConfig以匹配您的示例.
public static IServiceCollection SetupDependencyInjection(this
IServiceCollection services, IConfiguration config)
{
services.Configure<BrahBrahConfig>(config.GetSection("brahbrah"));
return services;
}
在上面的示例中,您看到可以在nuget包“ Microsoft.Extensions.Options.ConfigurationExtensions”中找到IServiceCollection Configure< TOptions>(此IServiceCollection服务,IConfiguration配置)的重载.
这种重载使您可以将IOptions实例直接注入到您选择的构造函数中.
private BrahBrahConfig _config;
public Parent(IOptions<BrahBrahConfig> config)
{
_config = config?.Value ?? throw new ArgumentNullException(nameof(config));
}
因此,在startup.cs中注册它之后,可以在父构造函数中使用IOptions作为参数,并使用这些设置来设置模型中的适当属性.