【问题标题】:Get Value from appsetting.json in class从类中的 appsetting.json 获取值
【发布时间】:2019-08-26 12:32:27
【问题描述】:

我下面有一些 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;

        }

我在 Startup 中添加了下面的 ConfigureServices。

services.AddSingleton<ITest, MyConfig>();

我无法访问数据。我怎么解决这个问题。 我想在一个类中回复 appsetting json,我在任何我想要的类中使用这个类。

提前致谢

【问题讨论】:

标签: c# asp.net-core dependency-injection asp.net-core-mvc


【解决方案1】:

真的没有必要传递IConfiguration。该框架已经内置了允许您从设置中的值绑定对象模型的功能

创建一个简单的类来保存您的配置。

public class MyConfig {
    public string BaseMediaUrl { get; set; }
    public string FolderAnnouncement { get; set; }
}

在 Startup 的 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;
}

注意 魔术字符串 是如何不再需要的。您可以通过属性访问所需的配置值。

参考Configuration in ASP.NET Core

【讨论】:

  • 将 appsettings.json 反序列化为对象的好方法。不知何故,到目前为止我在网上找到的所有其他示例看起来都如此复杂。
【解决方案2】:

通常你会注入你的 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");
  }

}

【讨论】:

    【解决方案3】:

    除了@nkosi 的回答之外,Options pattern 也适用于此:

    services.Configure<MyConfig>(configuration.GetSection(“MyConfig”));
    

    ...

    public class SomeClass
    {
        private MyConfig _options;
    
        public SomeClass(IOptions<MyConfig> options)
        {
            _options = options.Value;
        }
    
        private async Task<string> SaveAnnouncement(IFormFile file = null, string base64 = null)
        {
            string path = _options.FolderAnnouncement;
            ...
        }
    }
    

    如果您需要实时更改appsettings.json,可以使用其他变体;查看链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-18
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      相关资源
      最近更新 更多