我想要一个访问Configuration对象的简单静态类.所有配置信息都已从Startup类中的appsettings.json文件中读取.我只需要一种简单的方法来访问它.这可能吗?
namespace MyNamespace
{
public static class Config
{
public string Username => Configuration["Username"];
public string Password => Configuration["Password"];
}
}
Run Code Online (Sandbox Code Playgroud)
应用中的其他任何地方:
string username = Config.Username;
string password = Config.Password;
Run Code Online (Sandbox Code Playgroud)
小智 52
public static class ConfigurationHelper
{
public static IConfiguration config;
public static void Initialize(IConfiguration Configuration)
{
config = Configuration;
}
}
Run Code Online (Sandbox Code Playgroud)
ConfigurationHelper.Initialize(Configuration);
Run Code Online (Sandbox Code Playgroud)
e.g: ConfigurationHelper.config.GetSection("AWS:Accesskey").Value;
Run Code Online (Sandbox Code Playgroud)
小智 21
基于与上述相同的原理略短的版本...
public Startup(IConfiguration configuration)
{
Configuration = configuration;
StaticConfig = configuration;
}
public static IConfiguration StaticConfig { get; private set; }
Run Code Online (Sandbox Code Playgroud)
要在另一个静态类中使用:
string connString = Startup.StaticConfig.GetConnectionString("DefaultConnection");
Run Code Online (Sandbox Code Playgroud)
Tấn*_*ang 16
我也有类似的问题,在阅读了微软的文档后。我已经解决了:
public static class ApplicationSettings
{
public const string User = "UserOptions";
public static UserOptions UserOptions { get; set; } = new UserOptions();
// other options here...
}
Run Code Online (Sandbox Code Playgroud)
public class UserOptions
{
public string Username { get; set; };
public string Password { get; set; };
}
Run Code Online (Sandbox Code Playgroud)
ConfigurationManager configuration = builder.Configuration;
configuration.GetSection(ApplicationSettings.User).Bind(ApplicationSettings.UserOptions);
Run Code Online (Sandbox Code Playgroud)
{
"UserOptions": {
"Username": "input_your_username_here",
"Password": "input_your_password_here"
}
}
Run Code Online (Sandbox Code Playgroud)
public void MethodA()
{
string username = ApplicationSettings.UserOptions.Username;
string password = ApplicationSettings.UserOptions.Password;
}
public static void MethodB()
{
string username = ApplicationSettings.UserOptions.Username;
string password = ApplicationSettings.UserOptions.Password;
}
Run Code Online (Sandbox Code Playgroud)
希望这可以很好地帮助你。
Soe*_*hay 14
经过大量研究,这适用于(在 ASPNetCore 2.2 中)从静态类访问 appsettings.json 配置,但由于某种原因 appsettings.development.json 不再正确加载,但它可能是我项目中的其他东西把它搞砸了。reloadOnChange 确实有效。作为奖励,它还具有 IHostingEnvironment 和 IHttpContextAccessor。虽然这有效,但我最近决定切换回更多 DI 方法以遵循其他人提到的范式转变。
因此,这是在静态类中访问某些 DI 内容(包括配置)的众多方法之一:
AppServicesHelper.cs:
public static class AppServicesHelper
{
static IServiceProvider services = null;
/// <summary>
/// Provides static access to the framework's services provider
/// </summary>
public static IServiceProvider Services
{
get { return services; }
set
{
if (services != null)
{
throw new Exception("Can't set once a value has already been set.");
}
services = value;
}
}
/// <summary>
/// Provides static access to the current HttpContext
/// </summary>
public static HttpContext HttpContext_Current
{
get
{
IHttpContextAccessor httpContextAccessor = services.GetService(typeof(IHttpContextAccessor)) as IHttpContextAccessor;
return httpContextAccessor?.HttpContext;
}
}
public static IHostingEnvironment HostingEnvironment
{
get
{
return services.GetService(typeof(IHostingEnvironment)) as IHostingEnvironment;
}
}
/// <summary>
/// Configuration settings from appsetting.json.
/// </summary>
public static MyAppSettings Config
{
get
{
//This works to get file changes.
var s = services.GetService(typeof(IOptionsMonitor<MyAppSettings>)) as IOptionsMonitor<MyAppSettings>;
MyAppSettings config = s.CurrentValue;
return config;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
启动.cs:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddHttpContextAccessor();//For HttpContext.
// Register the IOptions object
services.Configure<MyAppSettings>(Configuration.GetSection(nameof(MyAppSettings)));
//Explicitly register the settings object by delegating to the IOptions object so that it can be accessed globally via AppServicesHelper.
services.AddSingleton(resolver => resolver.GetRequiredService<IOptionsMonitor<MyAppSettings>>().CurrentValue);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//...
AppServicesHelper.Services = app.ApplicationServices;
//...
}
Run Code Online (Sandbox Code Playgroud)
控制器:
public class MyController: Controller
{
public MyController()
{
}
public MyAppSettings Config => AppServicesHelper.Config;
public async Task<IActionResult> doSomething()
{
testModel tm = await myService.GetModel(Config.Setting_1);
return View(tm);
}
}
Run Code Online (Sandbox Code Playgroud)
另一个类库:
public static class MyLibraryClass
{
public static string GetMySetting_ => AppServicesHelper.Config.Setting_1;
public static bool IsDev => AppServicesHelper.HostingEnvironment.IsDevelopment();
}
Run Code Online (Sandbox Code Playgroud)
MyAppSettings.cs 是映射到 appsettings.json 中 MyAppSettings 部分的任何类:
public class MyAppSettings
{
public string Setting_1 {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"MyAppSettings": {
"Setting_1": "something"
}
}
Run Code Online (Sandbox Code Playgroud)
小智 8
我同意mcbowes,它在文档中,但第一个例子看起来更像你需要的...想要:
public class Program
{
public static IConfigurationRoot Configuration { get; set; }
public static void Main(string[] args = null)
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
Console.WriteLine($"option1 = {Configuration["option1"]}");
// Edit:
IServiceCollection services = new ServiceCollection();
services.AddOptions();
services.Configure<HelloWorldOptions>(_configuration.GetSection("HelloWorld"));
// And so on...
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
尽量避免使用静态类并使用 DI
namespace MyNamespace {
public interface IConfig {
string Username { get; }
string Password { get; }
}
public class Config : IConfig {
public Config(IConfiguration configuration) {
_configuration = configuration;
}
readonly IConfiguration _configuration;
public string Username => _configuration["Username"];
public string Password => _configuration["Password"];
}
}
Run Code Online (Sandbox Code Playgroud)
StartUp 类中的设置 DI
public class Startup {
public void ConfigureServices(IServiceCollection services) {
//...
services.AddTransient<IConfig, Config>();
...
}
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它
public class TestUsage {
public TestUsage(IConfig config) {
_config = config;
}
readonly IConfig _config;
public string Username => _config.Username;
public string Password => _config.Password;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用Signleton模式从任何地方访问您的配置
public class ConnectionStrings
{
private ConnectionStrings()
{
}
// property with getter only will not work.
public static ConnectionStrings Instance { get; protected set; } = new ConnectionStrings();
public string DatabaseConnection { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在你的创业班
public class Startup
{
private readonly IConfiguration configuration;
public Startup(IConfiguration configuration)
{
this.configuration = configuration;
configuration.GetSection("ConnectionStrings").Bind(ConnectionStrings.Instance);
}
public void ConfigureServices(IServiceCollection services)
{
}
public void Configure(IApplicationBuilder app)
{
}
}
Run Code Online (Sandbox Code Playgroud)
这已经说过了,但我还是要说一下。
我相信.Net Core 希望开发者通过依赖注入获得价值。这是我从研究中注意到的,但我也做了一些推测。作为开发人员,我们需要遵循这种范式转变才能很好地使用 .Net Core。
选项模式是静态配置的一个很好的替代方案。在你的情况下,它看起来像这样:
应用程序设置.json
{
"Username": "MyUsername",
"Password": "Password1234"
}
Run Code Online (Sandbox Code Playgroud)
系统用户.cs
{
"Username": "MyUsername",
"Password": "Password1234"
}
Run Code Online (Sandbox Code Playgroud)
启动.cs
public class SystemUser
{
public string Username { get; set; } = "";
public string Password { get; set; } = "";
}
Run Code Online (Sandbox Code Playgroud)
要使用 SystemUser 类,我们执行以下操作。
测试控制器.cs
services.Configure<SystemUser>(Configuration);
Run Code Online (Sandbox Code Playgroud)
尽管我们没有使用静态类,但我认为这是满足您需求的最佳选择。否则,您可能必须在 Startup 类中使用静态属性,在我看来这是一个可怕的解决方案。
mcb*_*wes -3
考虑使用此处的ASP.NET Core 配置说明。
您可以创建一个类来存储您的配置设置,然后访问这些值,如下所示:
_config.UserName
Run Code Online (Sandbox Code Playgroud)
在启动-配置服务中:
services.Configure<Config>(Configuration.GetSections("General"));
Run Code Online (Sandbox Code Playgroud)
然后只需在需要的地方注入您的对象即可:
IOptions<Config> config
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22534 次 |
| 最近记录: |