C# 从类中的appsetting.json获取值

C# 从类中的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;

下面我有一些appsetting.json

{
  "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反序列化为对象的简单而好的方法。不知怎的,我在网上找到的所有其他例子看起来都很复杂。