在不使用 DI 的情况下读取我的 .Net 5 应用程序中的应用程序设置

问题描述

我使用 .Net 5 创建了一个 MVC 应用程序。 然后我创建了一个自定义属性,应该从 appsettings.json 读取一些设置。 这是一个有效的解决方案:

public class MyCustomAttribute : Attribute
{
    public MyCustomAttribute(string key)
        : base()
    {
        IConfiguration conf = new ConfigurationBuilder()
           .SetBasePath(Directory.GetCurrentDirectory())
           .AddJsonFile("appsettings.json",optional: false,reloadOnChange: true)
           .Build();
        
        var value = conf.GetValue<string>(key);

        ...
    }

    ...
}

它有效,但我认为这不是正确的解决方案。我试着解释原因。

Program.cs 中,在构建主机之前,实例化 startup 类:

var builder = Host.CreateDefaultBuilder(args); builder
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder.UseStartup<Startup>();

    });

如果我将 IConfiguration 注入到 Strap,我可以获得 appsettings.json 值:

enter image description here

我认为从现在开始,我拥有了 appsettings.json 以及内存中的配置。

所以在我的自定义属性中,我必须再次从文件中读取设置,这对我来说似乎很奇怪! 问题是:如何读取自定义属性中的内存配置? 我的考虑是否正确?

谢谢。

编辑

我找到了另一种解决方案,但我仍然不喜欢它:

我以这种方式修改了 startup.cs ctor:

public Startup(IWebHostEnvironment environment,IConfiguration configuration)
{
    this._environment = environment;
    this._configuration = configuration;

    AppDomain.CurrentDomain.SetData("conf",this._configuration);
}

MyCustomAttribute 的 ctor 是这样的:

public class MyCustomAttribute : Attribute
{
    public MyCustomAttribute(string key)
        : base()
    {
        var conf = AppDomain.CurrentDomain.GetData("conf") as IConfiguration;
        var value = conf.GetValue<string>(key);

        ...
    }

    ...
}

这个解决方案也有效。但我希望 .Net 5 中存在一些开箱即用的东西。我希望读取配置时的正常行为与我的解决方案类似。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...