从Startup类访问Configuration对象

Chr*_*gax 5 c# asp.net-core-mvc

我想从我的ASP.NET vNext项目中的许多控制器中访问我公司的Active Directory,并将域名插入到我的config.json文件中,因此我可以从Configuration类访问它.我发现每次想要访问我的config.json时总是实例化一个新的Configuration对象很重,有没有办法通过IConfigurationAPI来访问初始化为Startup类的Configuration类?

Kir*_*lla 10

如何执行此操作的示例:

假设你有一个如下的config.json:

{
    "SomeSetting1": "some value here",
    "SomeSetting2": "some value here",
    "SomeSetting3": "some value here",
    "ActiveDirectory": {
        "DomainName": "DOMAIN-NAME-HERE"
    }
}
Run Code Online (Sandbox Code Playgroud)

创建一个包含选项信息的POCO类型:

public class ActiveDirectoryOptions
{
    public string DomainName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在Startup.cs中,配置服务时:

services.Configure<ActiveDirectoryOptions>(optionsSetup =>
{
    //get from config.json file
    optionsSetup.DomainName = configuration.Get("ActiveDirectory:DomainName");
});
Run Code Online (Sandbox Code Playgroud)

在所有想要获得此配置设置的控制器中,执行类似的操作......此处选项由DI系统注入:

public class HomeController : Controller
{
    private readonly IOptions<ActiveDirectoryOptions> _activeDirectoryOptions;

    public HomeController(IOptions<ActiveDirectoryOptions> activeDirectoryOptions)
    {
        _activeDirectoryOptions = activeDirectoryOptions;
    }

    public IActionResult Index()
    {
        string domainName = _activeDirectoryOptions.Options.DomainName;

        ........
    }
}
Run Code Online (Sandbox Code Playgroud)

回应评论:
我可以想到几个选项:

  1. 从行动中,你可以做到

    var options = HttpContext.RequestServices.GetRequiredService<IOptions<ActiveDirectoryOptions>>().Options;

  2. 您可以为装饰的动作设置参数FromServicesAttribute.该属性将导致从DI检索参数值.例:

    public IActionResult Index([FromServices] IOptions<ActiveDirectoryOptions> options)

我更喜欢#2而非#1,因为在单元测试的情况下它会为您提供所有相关部件的信息.

  • 您可以注入 IHttpContextAccessor。没有等效的 HttpContext.Current (2认同)