我想从类库中访问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
那样的替代品。
我假设您要从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;
}
}
然后,当类库中的方法需要设置时,我要么单独传递设置,要么传递整个对象。
我知道答案已被接受,但这个问题在Google上是最受欢迎的,而OP的问题是关于类库,而不是ASP.NET Web App或WebApi,这是接受的答案所使用的。
IMO,类库不应该使用应用程序设置,并且应该对这些设置不可知。如果您需要在类库中进行应用程序设置,那么您应该从您的使用者那里提供这些设置。你可以看到这个On This SO Question的一个例子
我知道这个问题有一个公认的答案,但问题是关于类库以及从类库中读取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
除了问题有一个公认的答案,我相信没有一个适用于没有启动项目或与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包:
在添加类的项目中添加System.Configuration
的引用,然后它允许您使用所有键。它对我有用。