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

问题描述 投票:26回答:5

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

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

这似乎是不好的选择,因为每次我们必须访问appsetting配置时我们必须添加json文件。我们没有像ASP.NET中的ConfigurationManager那样的替代品。

c# asp.net asp.net-core asp.net-core-mvc
5个回答
25
投票

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

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

appsettings.json中的部分

"ApplicationSettings": {
    "SmtpHost": "mydomain.smtp.com",
    "EmailRecipients": "[email protected];[email protected]"
}   

匹配模型类

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

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


36
投票

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

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


6
投票

我知道这个问题有一个公认的答案,但问题是关于类库以及从类库中读取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";
    }
}

有关详细信息,请查看This


4
投票

除了问题有一个公认的答案,我相信没有一个适用于没有启动项目或与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
  • Newtonsoft.Json
  • Microsoft.Extensions.Configuration.Json

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.