gpt4 book ai didi

c# - 无需依赖注入(inject)即可访问配置

转载 作者:IT王子 更新时间:2023-10-29 04:47:47 26 4
gpt4 key购买 nike

我想知道是否有一种方法可以在不使用依赖注入(inject)的情况下访问配置 (Microsoft.Extensions.Configuration)。只有我看到的示例是通过构造函数注入(inject)(使用 IOptions 或直接注入(inject)配置)。

我的难题是我有一个实用程序类(而不是服务),它具有动态执行操作的静态方法。在其中一些静态方法中,我想动态地从 appsettings.json 中检索几个属性。由于这是一个严格的实用程序类,我不想将此类注入(inject)到需要使用该实用程序中的一两个方法的所有其他类中。

关于如何在没有某种依赖注入(inject)的情况下访问 appsettings.json 的属性的任何想法。

仅供引用:使用 c# 和 .net core 1.1

最佳答案

哇,这么多评论,为什么人们不回答这个问题,而是告诉别人他们不想做他们显然会做的事情。不管怎样,希望这能让双方都满意。

如果您使用一个带有单个公共(public)构造函数的标准 AppSettings 类,该构造函数采用一个可用于填充所有 AppSettings 属性的 IConfiguration,这将保留依赖注入(inject)的能力。

如果在构造函数的末尾,我们设置了一个指向 AppSettings 的当前实例的静态属性“Current”,这将允许我们通过静态属性从该点开始访问设置,而无需进一步注入(inject)。

如果我们现在创建一个静态默认“GetCurrentSettings”方法来从 json 文件中获取设置,这可以用作默认实例化,这样如果调用“Current”并将其设置为 null,我们就可以离开并从文件中填充设置。这是我的意思的一个例子......

public class AppSettings
{
private static AppSettings _appSettings;

public string AppConnection { get; set; }

public AppSettings(IConfiguration config)
{
this.AppConnection = config.GetValue<string>("AppConnection");

// Now set Current
_appSettings = this;
}

public static AppSettings Current
{
get
{
if(_appSettings == null)
{
_appSettings = GetCurrentSettings();
}

return _appSettings;
}
}

public static AppSettings GetCurrentSettings()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();

IConfigurationRoot configuration = builder.Build();

var settings = new AppSettings(configuration.GetSection("AppSettings"));

return settings;
}
}

因此您可以在代码 AppSettings.Current.AppConnection 的任何位置调用

如果它是使用 DI 实例化的,则会检索注入(inject)的版本,否则将从 appsettings.json 文件中获取默认版本。我怀疑它是否能让每个人都满意,而且我不确定我是否已经很好地解释了它,但希望它是有意义的。

关于c# - 无需依赖注入(inject)即可访问配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41772001/

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