public class Bar
{
public static readonly string Foo = ConfigurationManager.AppSettings["Foo"];
}
在.NET Framework 4.x中,我可以使用ConfigurationManager.AppSettings ["Foo"]
在Foo
中获取Webconfig
,然后我可以轻松获取Foo
的值Bar.Foo
但在.Net核心中,我必须注入options
,并且无法通过Foo
Bar.Foo
的值
是否有方法,可以直接通过Bar.Foo
获取Foo
的值?
答案 0 :(得分:54)
所以有两种方法可以解决这个问题。
你有一个appsettings.json文件:
{
"myConfiguration": {
"myProperty": true
}
}
您可以像这样创建配置POCO:
public class MyConfiguration
{
public bool MyProperty { get; set; }
}
在您的startup.cs中,您的ConfigureServices中有一些注册配置的内容:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<MyConfiguration>(Configuration.GetSection("myConfiguration"));
}
然后在您的控制器/服务中注入IOptions并且它是可用的。
public class ValuesController : Controller
{
private readonly MyConfiguration _myConfiguration;
public ValuesController(IOptions<MyConfiguration> myConfiguration)
{
_myConfiguration = myConfiguration.Value;
}
}
就我个人而言,我不喜欢使用IOptions,因为我觉得它拖累了一些我并不想要的额外垃圾,但是你可以做一些很酷的事情,比如热插拔等等。
它大致相同,但在您的配置服务方法中,您改为绑定到POCO的单个部分。
public void ConfigureServices(IServiceCollection services)
{
//services.Configure<MyConfiguration>(Configuration.GetSection("myConfiguration"));
services.AddSingleton(Configuration.GetSection("myConfiguration").Get<MyConfiguration>());
}
然后你可以直接注入POCO:
public class ValuesController : Controller
{
private readonly MyConfiguration _myConfiguration;
public ValuesController(MyConfiguration myConfiguration)
{
_myConfiguration = myConfiguration;
}
}
有点简单,因为你应该使用一个接口来使单元测试更容易,但你明白了。
主要取自这里:http://dotnetcoretutorials.com/2016/12/26/custom-configuration-sections-asp-net-core/
答案 1 :(得分:18)
您也可以直接使用配置。注入您的设置,以便您可以使用DI ...
private readonly IConfiguration _configuration;
public MyClass(IConfiguration configuration)
{
_configuration = configuration;
}
然后你就可以阅读你的设置......
在这种情况下,我收集了一个收藏......
var myList = _configuration.GetSection("MyList").Get<List<string>>();
答案 2 :(得分:6)
最上面的解决方案既耗时又不简单,这是执行此操作的最佳有效方法,无需在启动时进行任何设置。就像使用良好的ol Configuration.Manager.AppSettings [“ setting”]
首先创建一个类似“凭据”的类:
public class Credential
{
public string Username {get;set}
public string Password {get;set;}
}
现在设置完毕,将IConfiguration放在您的构造函数上,如下所示:
private IConfiguration _configuration;
public ValuesController(IConfiguration iconfig)
{
_configuration = iconfig;
}
那您就可以调用它了!
Credential c = new Credential();
c.UserName = _configuration.GetValue<string>("Credential:username");
c.Password = _configuration.GetValue<string>("Credential:password");
假设您的appsettings.json看起来像这样:
"Credential": {
"username": "myuser",
"password": "mypassword"
}
希望这对某人有帮助。
答案 3 :(得分:1)
从@MindingData回答的其他内容。我喜欢使用Configuration.Bind(settings);
来递归映射设置,这样就不必在ConfigureServices
中添加每个新部分。
示例:
appsettings.json:
{
"MyConfiguration": {
"MyProperty": true
}
}
Settings类,属性必须与appsettings.json
名称相匹配:
public class Settings
{
public MyConfigurationSettings MyConfiguration { get; set; }
public class MyConfigurationSettings
{
public bool MyProperty { get; set; }
}
}
Startup.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
var settings = new Settings();
Configuration.Bind(settings);
services.AddSingleton(settings);
...
可以在像这样的控制器中使用:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly Settings _settings;
public ValuesController(Settings settings)
{
_settings = settings;
}
[HttpGet("GetValue")]
public ActionResult<string> Get()
{
return Ok(_settings.MyConfiguration.MyProperty);
}
}
答案 4 :(得分:1)
将您的班级定义为
public class MyClass{
private readonly IConfiguration _configuration;
public MyClass(IConfiguration configuration)
{
_configuration = configuration;
}
public void myFunction(){
var value= _configuration.GetValue("xxx");
}
}
当您从其他任何地方调用它时
IConfiguration config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: false).Build();
MyClass myclass = new MyClass(config)
答案 5 :(得分:1)
如果您已经将您的配置传递给控制器并且不想在启动配置中映射另一个服务,您可以通过这种方式轻松地从配置中获取您的价值:
public Startup(IConfiguration configuration)
{
Configuration = configuration;
var myProperty = _configuration.GetSection("MyConfiguration")["MyProperty"];
}
使用字典属性。
享受
答案 6 :(得分:0)
将其添加到AppSettings.json文件中
"Swagger": { "Title": "API DEVELOPMENT" }
然后在Startup.cs
文件中进行配置
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
下一步从appsettings.json
中获取值
var title = Configuration.GetSection("Swagger:Title").Value;
最后放在这里
services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = title, Version = "v1" }); }