从类库访问 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
那样的替代方案吗?
答案已经被接受,但这个问题是谷歌和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);