问题描述
我使用 .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
值:
我认为从现在开始,我拥有了 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 (将#修改为@)