从类库访问 Asp.net 核中的 appsetting.json

本文关键字:appsetting json net 类库 访问 Asp | 更新日期: 2023-09-27 17:57:10

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

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

这似乎是不好的选择,因为每次我们必须访问 appset 配置时,我们都必须添加 json 文件。难道我们没有像 ASP.NET ConfigurationManager那样的替代方案吗?

从类库访问 Asp.net 核中的 appsetting.json

我知道

答案已经被接受,但这个问题是谷歌和OP问题的首要热门,是关于类库的,而不是 ASP.NET 的Web应用程序或WebApi,这是接受的答案使用的。

IMO,类库不应使用应用程序设置,并且应与此类设置无关。如果需要类库中的应用程序设置,则应从使用者提供这些设置。你可以看到这个关于这个问题

的例子

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

我创建了一个模型类,该类具有与 appsettings.json 一节中的设置匹配的属性。

appsettings.json 中的部分

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

匹配模型类

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

然后填充该模型类并将其添加到 DI 容器中的 IOptions 集合中(此操作在 Startup 类的 Configure() 方法中完成)。

services.Configure<AppSettingsModel>(Configuration.GetSection("ApplicationSettings"));
// Other configuration stuff
services.AddOptions();

然后,可以通过框架调用的任何方法访问该类,方法是将其作为参数添加到构造函数中。框架处理查找类并将其提供给构造函数。

public class MyController: Controller
{
    private IOptions<AppSettingsModel> settings;
    public MyController(IOptions<AppSettingsModel> settings)
    {
        this.settings = settings;
    }
}

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

除了问题有一个公认的答案之外,我相信没有一个只适用于类库,没有启动项目或依赖于Asp.NetCore堆栈或IServiceCollection。

这就是我从类库中读取配置的方式:

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.扩展.配置
  • Microsoft.扩展名.配置.文件扩展名
  • Microsoft.扩展.文件提供程序.抽象
  • 牛顿软件.Json
  • Microsoft.Extensions.Configuration.Json

我知道这个问题有一个公认的答案,但问题是关于类库的,从类库中读取appsettings.json的方法如下:

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

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

在应用设置中添加实际设置.json

  "ConfigurationManager": {
    "BaseUrl": "myValue"
  }

现在,在启动时向模型注册 appsettings.json 部分.cs:

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

在类库中创建一个使用

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";
    }
}

有关更多详细信息,请查看此

这很容易做到

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;

在类构造函数 DI 中工作。Microsoft文档在这里

Directory.SetCurrentDirectory(AppContext.BaseDirectory);
var builder = new ConfigurationBuilder().SetBasePath (  Path.Combine(Directory.GetCurrentDirectory())   )
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);