gpt4 book ai didi

c# - 从启动类访问配置对象

转载 作者:太空狗 更新时间:2023-10-29 22:26:11 33 4
gpt4 key购买 nike

我想从我的 ASP.NET vNext 项目的许多 Controller 中访问我公司的 Active Directory,我将域名插入到我的 config.json 文件中,这样我就可以从配置类访问它。我发现每次我想访问我的 config.json 时总是实例化一个新的 Configuration 对象很麻烦,有没有办法通过 IConfiguration API 访问初始化到 Startup 类中的 Configuration 类?

最佳答案

如何执行此操作的示例:

假设您有一个如下所示的 config.json:

{
"SomeSetting1": "some value here",
"SomeSetting2": "some value here",
"SomeSetting3": "some value here",
"ActiveDirectory": {
"DomainName": "DOMAIN-NAME-HERE"
}
}

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

public class ActiveDirectoryOptions
{
public string DomainName { get; set; }
}

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

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

在所有想要获取此配置设置的 Controller 中,执行类似...此处的选项由 DI 系统注入(inject):

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

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

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

........
}
}

回应评论:

Dependency Injection was one of my option, but assume that you inject many repository inside your controller and a UserManager object because you want some user management, your constructor will be very busy. And all the time you want to use your controller, an IOptions object will be instanciate, but what if you just want to use this object in one method of your controller ?

我能想到几个选项:

  1. 在 Action 中,你可以做

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

  2. 您可以为使用 FromServicesAttribute 修饰的操作设置一个参数.该属性将导致从 DI 中检索参数值。示例:

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

我更喜欢 #2 而不是 #1,因为在单元测试的情况下,它会为您提供有关所有依赖部分的信息。

关于c# - 从启动类访问配置对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28897372/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com