ASP.NET Core Web API:如何为API与业务逻辑项目注册不同appsettings.json
解决方案:Web API与BL项目独立配置文件的优雅注册方式
问题场景
- 拥有Web API和业务逻辑(BL)两个项目,Web API依赖BL项目
- 两个项目各自维护独立的
appsettings.json配置文件 - 在Web API的
Program.cs中尝试绑定BL的配置选项,但BL服务中获取到的配置属性全为null - 不想将BL的配置文件放到API项目目录下,也不愿使用硬编码的绝对路径加载配置
方法1:让BL项目封装自身配置注册逻辑(推荐)
让BL项目自己负责加载和注册配置,API项目只需调用现成的扩展方法,无需关心路径细节。
配置BL项目的配置文件属性:
在BL项目中选中appsettings.json,右键设置「复制到输出目录」为如果较新则复制或始终复制,确保编译后配置文件会随BL程序集一起输出。在BL项目中创建配置扩展类:
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace YourBlProjectNamespace { public static class BlConfigurationExtensions { public static IServiceCollection AddBlConfiguration(this IServiceCollection services) { // 获取BL程序集所在目录,以此为基础加载配置文件 var blAssemblyPath = System.Reflection.Assembly.GetExecutingAssembly().Location; var blDirectory = Path.GetDirectoryName(blAssemblyPath); var blConfig = new ConfigurationBuilder() .SetBasePath(blDirectory) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); // 注册BL的配置选项 services.AddOptions<BlAppSettingsOptions>() .Bind(blConfig.GetSection("BlAppSettings")); return services; } } }
- 在Web API中调用扩展方法:
// 先注册API自身的配置 builder.Services.AddOptions<ApiAppSettingsOptions>() .Bind(builder.Configuration.GetSection("ApiAppSettings")); // 调用BL的配置注册扩展 builder.Services.AddBlConfiguration();
方法2:在API项目中通过程序集路径加载BL配置
如果不想在BL中封装逻辑,也可以直接在API项目中通过BL程序集的位置定位配置文件:
// 获取BL项目程序集的目录 var blAssembly = typeof(BlAppSettingsOptions).Assembly; var blAssemblyDir = Path.GetDirectoryName(blAssembly.Location); // 将BL的配置文件添加到API的配置体系中 builder.Configuration.AddJsonFile( Path.Combine(blAssemblyDir, "appsettings.json"), optional: false, reloadOnChange: true ); // 绑定BL配置选项 builder.Services.AddOptions<BlAppSettingsOptions>() .Bind(builder.Configuration.GetSection("BlAppSettings"));
方法3:配置分层合并
如果允许统一管理配置,可以将BL的配置节点合并到API的appsettings.json中,BL项目保留自己的配置文件作为模板:
- BL项目保留
appsettings.json作为配置模板,用于开发时参考 - 在API的
appsettings.json中添加BL的配置节点:
{ "ApiAppSettings": { "ApiUrl": "https://api.example.com" }, "BlAppSettings": { "DbConnectionString": "Server=.;Database=BlDb;Trusted_Connection=True;", "MaxRetryCount": 3 } }
这种方式适合配置需要集中管理的场景,避免多文件分散。
内容的提问来源于stack exchange,提问作者Fjalee
相关产品推荐
相关产品推荐

