ASP.Net Core 2 中的全局变量

Posted

技术标签:

【中文标题】ASP.Net Core 2 中的全局变量【英文标题】:Global Variables in ASP.Net Core 2 【发布时间】:2019-03-10 07:02:54 【问题描述】:

我正在用 ASP.NET Core 开发一个 Web 应用程序,目前有大量的密钥,例如条带帐户密钥。我不想让它们以不同的类分布在整个项目中,我想将它们全部放在 json 中,以便全局访问它们。我尝试将它们放在 appsettings.json 中,但无法在任何地方访问它们。

【问题讨论】:

将它们放在 appsettings 中是处理这类事情的好地方(记得将该文件添加到您的 gitignore 中!)要在控制器中访问它们,您需要使用 DI。 尝试放入 appsettings.json,然后创建一个类来帮助存储这些值 【参考方案1】:

我经常用连接字符串和其他全局常量做这种事情。首先为您需要的那些变量创建一个类。在我的项目中,它是 MDUOptions,但无论你想要什么。

public class MDUOptions

    public string mduConnectionString  get; set; 
    public string secondaryConnectionString  get; set; 

现在在您的 Startup.cs ConfigureServices 方法中:

Action<MDU.MDUOptions> mduOptions = (opt =>

    opt.mduConnectionString = Configuration["ConnectionStrings:mduConnection"];
);
services.Configure(mduOptions);
services.AddSingleton(resolver => resolver.GetRequiredService<IOptions<MDUOptions>>().Value);

现在你使用 DI 在代码中访问它:

public class PropertySalesRepository : IPropertySalesRepository

    private static string _mduDb;

    public PropertySalesRepository(MDUOptions options)
    
        _mduDb = options.mduConnectionString;
    
    ....

就我而言,我想要的唯一属性是字符串,但我可以使用整个选项类。

【讨论】:

谢谢@nurdyguy,这个答案很清楚!就一个跟进,如何获取你在 PropertySalesRepository 构造函数中使用的 MDUOptions 参数? 框架内置的依赖注入将填充options 变量。 services.AddSingleton(...) 行对此至关重要。 这里是关于依赖注入的更多信息,它很神奇! docs.microsoft.com/en-us/aspnet/core/fundamentals/… @nurdyguy 为什么不创建一个静态类呢? @OffirPe'er 你的意思是一个带有一堆硬编码字符串值的静态类吗?当您对不同的环境(dev vs qa vs prod)有不同的值时会发生什么?使用 IOptions 是做这种事情的最佳方式,尽管在过去 2 年中实现发生了一些变化:docs.microsoft.com/en-us/dotnet/api/…【参考方案2】:

在 appsettings.json 中保留变量。


    "foo": "value1",
    "bar": "value2",

创建 AppSettings 类。

public class AppSettings

    public string foo  get; set; 

    public string bar  get; set; 

Startup.cs文件中注册。

public IServiceProvider ConfigureServices(IServiceCollection services)

    services.Configure<AppSettings>(Configuration);

用法,

public class MyController : Controller

    private readonly IOptions<AppSettings> _appSettings;

    public MyController(IOptions<AppSettings> appSettings)
    
        _appSettings = appSettings;
    
    var fooValue = _appSettings.Value.foo;
    var barValue = _appSettings.Value.bar;

【讨论】:

以上是关于ASP.Net Core 2 中的全局变量的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 中的Ajax全局Antiforgery Token配置

ASP.NET Core 2.1 中的 Scaffold Identity UI 并添加全局过滤器

ASP.NET Core 定时刷新第三方 Token

为 Web 应用程序创建全局变量 - ASP.NET

如何在 asp.net c# 渲染覆盖中设置全局变量?

Windows azure 云服务中的全局变量