从 class 库访问 Asp.net-core 中的 appsetting.json

Access from class library to appsetting.json in Asp.net-core

我正在尝试从 class 库访问 appsetting.json 文件。到目前为止,我找到的解决方案是从 Microsoft.Extensions.Configuration 创建一个实现接口 IConfiguration 的配置 class 并将 json 文件添加到 class 并从中读取.

var configuration = new Configuration();
configuration.AddJsonFile("appsetting.json");
var connectionString= configuration.Get("connectionString");

这似乎是一个糟糕的选择,因为我们每次必须访问应用程序设置配置时都必须添加 json 文件。难道我们没有像 ASP.NET.

中的 ConfigurationManager 这样的替代方案吗?

我假设您想从 Web 应用程序访问 appsettings.json 文件,因为 class 库默认没有 appsettings.json

我创建了一个模型 class,它的属性与 appsettings.json 中某个部分的设置相匹配。

appsettings.json

中的部分
"ApplicationSettings": {
    "SmtpHost": "mydomain.smtp.com",
    "EmailRecipients": "me@mydomain.com;other@mydomain.com"
}   

匹配模型class

namespace MyApp.Models
{
    public class AppSettingsModel
    {
        public string SmtpHost { get; set; }
        public string EmailRecipients { get; set; }
    }
}

然后填充该模型 class 并将其添加到 DI 容器中的 IOptions 集合(这是在 Startup class 的 Configure() 方法中完成的) .

services.Configure<AppSettingsModel>(Configuration.GetSection("ApplicationSettings"));

// Other configuration stuff

services.AddOptions();

然后您可以通过将框架作为参数添加到构造函数中来从框架调用的任何方法访问 class。该框架负责查找 class 并将其提供给构造函数。

public class MyController: Controller
{
    private IOptions<AppSettingsModel> settings;

    public MyController(IOptions<AppSettingsModel> settings)
    {
        this.settings = settings;
    }
}

然后当 class 库中的方法需要设置时,我要么单独传递设置,要么传递整个对象。

我知道答案已经被接受,但是这个问题是 Google 上的热门问题,OP 问题是关于 class 库而不是 ASP.NET 网络应用程序或已接受的答案使用的是 WebApi。

IMO,class 图书馆不应该使用应用程序设置,并且应该与此类设置无关。如果您需要 class 库中的应用程序设置,那么您应该从消费者那里提供这些设置。你可以看到这个

的例子

我知道这个问题有一个可接受的答案,但问题是关于 class 库的,从 class 库读取 appsettings.json 的方法如下:

创建一个模型,使其具有与设置文件中的属性相匹配的属性:

public class ConfigurationManager
{
    public string BaseUrl { get; set; }
}

在 appsettings.json

中添加实际设置
  "ConfigurationManager": {
    "BaseUrl": "myValue"
  }

现在用您的模型在 startup.cs 中注册 appsettings.json 部分:

 services.Configure<ConfigurationManager>(Configuration.GetSection("ConfigurationManager"));

在您的 class 库中创建一个使用

的 class
using Microsoft.Extensions.Options;

并获取您的配置设置:

using Microsoft.Extensions.Options;


public class KeyUrls: IKeyUrls
{
    public string BaseUrl = "";
    private readonly IOptions<ConfigurationManager> _configurationService;

    public KeyUrls(IOptions<ConfigurationManager> configurationservice)
    {
        _configurationService = configurationservice;
        BaseUrl = _configurationService.Value.BaseUrl;
    }

    public  string GetAllKeyTypes()
    {
        return $"{BaseUrl}/something";
    }

    public  string GetFilteredKeys()
    {
        return $"{BaseUrl}/something2";
    }
}

有关详细信息,请查看 This

除了问题有一个可接受的答案外,我相信没有任何人可以只适用于 class 库而没有启动项目或与 Asp.NetCore 堆栈或 IServiceCollection 有依赖关系。

这就是我从 class 库中读取配置的方法:

using Microsoft.Extensions.Configuration;
using System.IO;

public class ConfigSample
{
    public ConfigSample
    {
            IConfigurationBuilder builder = new ConfigurationBuilder();
            builder.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "appsettings.json"));

            var root = builder.Build();
            var sampleConnectionString = root.GetConnectionString("your-connection-string");
    }
}

需要以下 nuget 包:

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.FileProviders.Abstractions
  • Newtonsoft.Json
  • Microsoft.Extensions.Configuration.Json

适用于 class 构造函数 DI。 微软文档 Here

这很容易做到

string c = Directory.GetCurrentDirectory();
IConfigurationRoot configuration = 
newConfigurationBuilder().SetBasePath(c).AddJsonFile("appsettings.json").Build();
string connectionStringIs = configuration.GetConnectionString("MyConnection"); 

从最后一行可以得到连接字符串

如果要配置上下文,请额外编写以下代码:

optionsBuilder.UseSqlServer(connectionStringIs); //inside protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

不要忘记安装和使用这些包:-

using Microsoft.Extensions.Configuration; 
using Microsoft.Extensions.Configuration.FileExtensions; 
using Newtonsoft.Json; 
using Microsoft.Extensions.Configuration.Json; 
using System.IO;
Directory.SetCurrentDirectory(AppContext.BaseDirectory);
var builder = new ConfigurationBuilder().SetBasePath (  Path.Combine(Directory.GetCurrentDirectory())   )
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);