繁体   English   中英

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

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

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

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

这似乎是一个糟糕的选择,因为我们每次必须访问 appsetting 配置时都​​必须添加 json 文件。 我们没有像ASP.NET 中的ConfigurationManager这样的替代方案。

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

IMO,类库不应使用应用程序设置,并且应与此类设置无关。 如果您需要类库中的应用程序设置,那么您应该从您的使用者那里提供这些设置。 您可以在 On This SO Question 上看到一个示例

我假设您想从 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.Extensions.Configuration
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.FileProviders.Abstractions
  • 牛顿软件
  • Microsoft.Extensions.Configuration.Json

我知道这个问题有一个可接受的答案,但问题是关于类库和从类库读取 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"));

在您的类库中创建一个正在使用的类

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 中工作。 微软文档在这里

在您添加类的项目中添加System.Configuration 引用 ,然后它允许您使用所有键。 它为我工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM