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

标签 c# .net-core

我想知道是否有一种方法可以在不使用依赖注入(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/

相关文章:

c# - wpf 阿拉伯文字显示不正确

C# 或 C++ - Windows 图形概述的好资源 - 2D,直接绘制像素

c# - 一起使用事件驱动的 TCP 客户端和 NotifyPropertyChanged 会导致异常

c# - 如何在我的 ActionFilter 中获取对 ModelState 属性的引用?

.Net Core appsettings.json 最佳实践 - 覆盖开发设置(反之亦然)?

c# - EF Core 在映射到 Select 中的对象时查询 SQL 中的所有列

linux - 如何在已部署的应用程序中检查 .NET Core 的版本?

c# - 数据绑定(bind) DockPanel

.net-core - 调试器未启动,退出代码 0

c# - .NET core 3.1 中未找到 MenuItem 和 ContextMenuItem