C# 从类中的appsetting.json获取值
下面我有一些appsetting.jsonC# 从类中的appsetting.json获取值,c#,asp.net-core,dependency-injection,asp.net-core-mvc,C#,Asp.net Core,Dependency Injection,Asp.net Core Mvc,下面我有一些appsetting.json { "MyConfig": { "FolderAnnouncement": "Duyuru\\", "BaseMediaUrl": "D:\\YoungTalent\\YTPanel\\YTPanel\\wwwroot\\images\\" }, "ConnectionStrings": { "MySqlCon": "Server=localhost;Database=kariyer_portal;Uid=root;
{
"MyConfig": {
"FolderAnnouncement": "Duyuru\\",
"BaseMediaUrl": "D:\\YoungTalent\\YTPanel\\YTPanel\\wwwroot\\images\\"
},
"ConnectionStrings": {
"MySqlCon": "Server=localhost;Database=kariyer_portal;Uid=root;Pwd=1234;",
"MsSqlCon": "Server=localhost\\SQLEXPRESS;Database=kariyer_portal;Trusted_Connection=True;ConnectRetryCount=0"
},
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*"
}
我有一节课是MyConfig
namespace YTPanel.Models.Model
{
public interface ITest { string GetFolders(string param); }
public class MyConfig: ITest
{
public MyConfig(IConfiguration configuration)
{
Configuration = configuration;
}
private readonly IConfiguration Configuration;
public string BaseMediaUrl { get; set; }
public string FolderAnnouncement { get; set; }
public string GetFolders(string param)
{
string here = Configuration["MyConfig:" + param];
return here;
}
}
}
我想从另一个班级叫这个班
MyConfig conf;
private string SaveAnnouncement(IFormFile file=null,string base64=null)
{
string path = conf.GetFolders("FolderAnnouncement");
string imageUrl = Guid.NewGuid().ToString();
var mediaPath = conf.GetFolders("BaseMediaUrl");
string extension = Path.GetExtension(file.FileName);
var imagePath = mediaPath + path + imageUrl+extension;
if (!string.IsNullOrEmpty(base64))
{
byte[] bytes = Convert.FromBase64String(base64);
File.WriteAllBytes(imagePath, bytes);
}
else
{
using (var fileStream = new FileStream(imagePath, FileMode.Create))
{
file.CopyToAsync(fileStream);
}
}
return imageUrl+extension;
}
我在启动时添加了下面的ConfigureServices
//bind object model from configuration
MyConfig myConfig = Configuration.GetSection("MyConfig").Get<MyConfig>();
//add it to services
services.AddSingleton(myConfig);
services.AddSingleton
我拿不到数据。我怎样才能解决这个问题。
我想在一个类中访问appsetting json,我想在任何类中使用这个类
提前感谢通常,您会通过接口注入MyTest类,并像这样使用它:
public class AnnouncementSaver {
private ITest config;
public AnnouncementSaver(ITest config) {
// inject it
this.config = config;
}
private string SaveAnnouncement (IFormFile file = null, string base64 = null) {
// use it
config.GetFolders("FolderAnnouncement");
}
}
通常,您会通过接口注入MyTest类,并像这样使用它:
public class AnnouncementSaver {
private ITest config;
public AnnouncementSaver(ITest config) {
// inject it
this.config = config;
}
private string SaveAnnouncement (IFormFile file = null, string base64 = null) {
// use it
config.GetFolders("FolderAnnouncement");
}
}
确实不需要传递IConfiguration。该框架已经内置了一些功能,允许您根据设置中的值绑定对象模型 创建一个简单的类来保存配置
public class MyConfig {
public string BaseMediaUrl { get; set; }
public string FolderAnnouncement { get; set; }
}
在启动时在ConfigureServices中设置类
//bind object model from configuration
MyConfig myConfig = Configuration.GetSection("MyConfig").Get<MyConfig>();
//add it to services
services.AddSingleton(myConfig);
并在需要时注入强类型配置类
private readonly MyConfig conf;
//Constructor
public AnnouncementService(MyConfig config) {
this.conf = config;
}
private async Task<string> SaveAnnouncement(IFormFile file = null, string base64 = null) {
string path = conf.FolderAnnouncement;
string imageUrl = Guid.NewGuid().ToString();
var mediaPath = conf.BaseMediaUrl;
string extension = Path.GetExtension(file.FileName);
var imagePath = mediaPath + path + imageUrl+extension;
if (!string.IsNullOrEmpty(base64)) {
byte[] bytes = Convert.FromBase64String(base64);
File.WriteAllBytes(imagePath, bytes);
} else {
using (var fileStream = new FileStream(imagePath, FileMode.Create)) {
await file.CopyToAsync(fileStream);
}
}
return imageUrl+extension;
}
请注意,神奇的字符串是如何不再需要的。您可以通过属性访问所需的配置值
参考确实不需要传递IConfiguration。该框架已经内置了一些功能,允许您根据设置中的值绑定对象模型 创建一个简单的类来保存配置
public class MyConfig {
public string BaseMediaUrl { get; set; }
public string FolderAnnouncement { get; set; }
}
在启动时在ConfigureServices中设置类
//bind object model from configuration
MyConfig myConfig = Configuration.GetSection("MyConfig").Get<MyConfig>();
//add it to services
services.AddSingleton(myConfig);
并在需要时注入强类型配置类
private readonly MyConfig conf;
//Constructor
public AnnouncementService(MyConfig config) {
this.conf = config;
}
private async Task<string> SaveAnnouncement(IFormFile file = null, string base64 = null) {
string path = conf.FolderAnnouncement;
string imageUrl = Guid.NewGuid().ToString();
var mediaPath = conf.BaseMediaUrl;
string extension = Path.GetExtension(file.FileName);
var imagePath = mediaPath + path + imageUrl+extension;
if (!string.IsNullOrEmpty(base64)) {
byte[] bytes = Convert.FromBase64String(base64);
File.WriteAllBytes(imagePath, bytes);
} else {
using (var fileStream = new FileStream(imagePath, FileMode.Create)) {
await file.CopyToAsync(fileStream);
}
}
return imageUrl+extension;
}
请注意,神奇的字符串是如何不再需要的。您可以通过属性访问所需的配置值
参考资料除了@nkosi的答案外,以下内容也适用:
services.Configure<MyConfig>(configuration.GetSection(“MyConfig”));
如果需要捕获对appsettings.json的实时更改,还可以使用其他变体;请参阅链接。除了@nkosi的答案外,该选项也适用于此:
services.Configure<MyConfig>(configuration.GetSection(“MyConfig”));
如果需要捕获对appsettings.json的实时更改,还可以使用其他变体;查看链接。当你说你无法获取数据时,这是什么意思?它是抛出异常还是其他原因?@ScottHannen它返回null如果您想在不依赖项的情况下访问appsetting文件,请参考此注释,它将对您有所帮助。当你说你无法获得数据时,你可以在这里看到接受答案,这是什么意思?它是抛出异常还是其他原因?@ScottHannen它返回null如果您想在不依赖项的情况下访问appsetting文件,请参考此注释,它将对您有所帮助。您可以在这里看到accept-answer,这是一种将appsettings.json反序列化到对象的简单方法。不知何故,我在网上找到的所有其他示例看起来都很复杂。将appsettings.json反序列化为对象的简单而好的方法。不知怎的,我在网上找到的所有其他例子看起来都很复杂。