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

Par*_*Rao 29 c# asp.net-core-mvc .net-core asp.net-core

我试图appsetting.json从类库中访问文件.到目前为止,我发现的解决方案是创建实现接口的配置类IConfiguration,从 Microsoft.Extensions.Configuration和JSON文件添加到类,并从相同的阅读.

var configuration = new Configuration();
configuration.AddJsonFile("appsetting.json");
var connectionString= configuration.Get("connectionString");
Run Code Online (Sandbox Code Playgroud)

这似乎是不好的选择,因为每次我们必须访问appsetting配置时我们必须添加json文件.我们不要有任何替代像ConfigurationManagerASP.NET.

Ste*_*ter 39

我知道答案已经被接受了,但是这个问题在Google上是最受欢迎的,而OP的问题是关于类库,而不是ASP.NET Web App或WebApi,这是接受的答案所使用的.

IMO,类库不应该使用应用程序设置,并且应该对这些设置不可知.如果您需要在类库中进行应用程序设置,那么您应该从您的使用者那里提供这些设置.你可以看到这个问题的一个例子

  • 我部分同意; 对于**测试项目**,在dotnet核心解决方案中设置为类库,使用或嵌入appsettings是完全可以接受的.在这种情况下,测试项目例如类库_is_当然是消费者. (7认同)
  • 当然,类库应该使用指向本地数据库实例的连接字符串。而该设置被 CI 系统覆盖以使用另一个实例。恕我直言,这个答案还没有解决方案。它不是关于 asp.net 核心,而是关于 .NET CORE 读取 appsettings! (2认同)
  • @StephenPorter 我不同意。在一个高度划分的生态系统中,每个 DLL 都可能利用可配置的功能,主要消费者不知道层层中发生了什么。例如,成像组件可以被配置为利用不同的成像提供器。值得庆幸的是,微软将 `System.Configuration` 重新引入了 CORE,它支持 `app.config` 文件。这对于那些将项目从框架迁移到核心的人来说尤其重要 (2认同)
  • @斯蒂芬P。你说 - *“IMO,类库不应该使用应用程序设置”*。看来连微软也不同意这个假设。因为你以“Entity Framework”为例,它在“.config”中有很多东西,而 EF 是一个类库。所以,我不知道。也许你有不同的意思? (2认同)

Cli*_*t B 27

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

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

appsettings.json中的部分

"ApplicationSettings": {
    "SmtpHost": "mydomain.smtp.com",
    "EmailRecipients": "me@mydomain.com;other@mydomain.com"
}   
Run Code Online (Sandbox Code Playgroud)

匹配模型类

namespace MyApp.Models
{
    public class AppSettingsModel
    {
        public string SmtpHost { get; set; }
        public string EmailRecipients { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

// Other configuration stuff

services.AddOptions();
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过在构造函数中将其添加为参数,从框架调用的任何方法访问该类.该框架处理查找并向构造函数提供类.

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

    public MyController(IOptions<AppSettingsModel> settings)
    {
        this.settings = settings;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 原始海报询问如何从类库而不是从 ASP.Net MVC 控制器访问配置。 (21认同)
  • 不确定自从这被接受为答案以来是否发生了变化,但是当我两天前开始一个新项目时,它对我不起作用。为了使其正常工作,我所做的更改是: 我必须将其更改为 AppSettingsModel 设置,而不是 IOptions&lt;AppSettingsModel&gt; 设置;然后在控制器构造函数中,我更改了这一行 this.settings = settings; 到 this.settings = settings.Value; 然后它开始工作了。 (2认同)

小智 9

这很容易做到

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

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

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

optionsBuilder.UseSqlServer(connectionStringIs); //inside protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
Run Code Online (Sandbox Code Playgroud)

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

using Microsoft.Extensions.Configuration; 
using Microsoft.Extensions.Configuration.FileExtensions; 
using Newtonsoft.Json; 
using Microsoft.Extensions.Configuration.Json; 
using System.IO;
Run Code Online (Sandbox Code Playgroud)


Thu*_*3eR 6

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

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

public class ConfigurationManager
{
    public string BaseUrl { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在appsettings.json中添加实际设置

  "ConfigurationManager": {
    "BaseUrl": "myValue"
  }
Run Code Online (Sandbox Code Playgroud)

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

 services.Configure<ConfigurationManager>(Configuration.GetSection("ConfigurationManager"));
Run Code Online (Sandbox Code Playgroud)

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

using Microsoft.Extensions.Options;
Run Code Online (Sandbox Code Playgroud)

并获取您的配置设置:

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请查看


Car*_*dez 5

除了问题有一个可以接受的答案外,我相信没有任何一个仅适用于一个类库,而不具有Startup项目或与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");
    }
}
Run Code Online (Sandbox Code Playgroud)

需要以下nuget软件包:

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.FileProviders.Abstractions
  • 牛顿
  • Microsoft.Extensions.Configuration.Json