- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想知道是否有一种方法可以在不使用依赖注入(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/
这实际上是我问的问题的一部分here ,该问题没有得到答复,最终被标记为重复。 问题:我只需使用 @Autowired 注释即可使用 JavaMailSender。我没有通过任何配置类公开它。 @Co
我是一名优秀的程序员,十分优秀!