ASP.NET与ASP.NET Core全框架共享类库多配置读取可行性咨询
实现动态配置读取的可行方案
当然可以实现这个场景!核心思路是让CL3能根据调用它的宿主环境,自动切换配置读取逻辑。下面给你两个实用的方案,你可以根据项目的现有代码结构来选择:
方案一:依赖注入(推荐,符合现代.NET设计理念)
这是最优雅的方式,能让你的代码更易维护、可测试:
- 首先在CL3中定义一个配置读取的接口,比如:
public interface IConfigReader { string GetSetting(string key); // 可以根据需要扩展其他方法,比如获取强类型配置 } - 为传统ASP.NET实现一个基于Web.config的读取器:
public class WebConfigReader : IConfigReader { public string GetSetting(string key) { return System.Configuration.ConfigurationManager.AppSettings[key]; } } - 为ASP.NET Core实现一个基于appsettings.json的读取器:
public class AppSettingsReader : IConfigReader { private readonly IConfiguration _configuration; public AppSettingsReader(IConfiguration configuration) { _configuration = configuration; } public string GetSetting(string key) { return _configuration[key]; } } - 在CL3的业务逻辑类中,通过构造函数注入
IConfigReader,而不是直接硬编码读取配置:public class BusinessLogic { private readonly IConfigReader _configReader; public BusinessLogic(IConfigReader configReader) { _configReader = configReader; } public void DoWork() { var settingValue = _configReader.GetSetting("YourSettingKey"); // 业务逻辑代码 } } - 最后在两个Web应用中分别注册对应的实现:
- 传统ASP.NET:可以手动实例化
WebConfigReader并传入CL3的业务类,或者用老的DI容器(比如Unity)注册接口和实现 - ASP.NET Core:在
Startup.cs的ConfigureServices方法中注册:services.AddScoped<IConfigReader, AppSettingsReader>(); // 同时确保IConfiguration已经被正确配置(默认模板已经处理好了)
- 传统ASP.NET:可以手动实例化
方案二:检测运行时环境(适合不想大幅修改现有代码的场景)
如果你的CL3现有代码大量使用静态方法读取配置,不想重构为依赖注入,可以通过检测当前运行环境来切换读取逻辑:
public static class ConfigHelper { public static string GetSetting(string key) { // 检测是否处于ASP.NET Core环境 bool isAspNetCore = AppDomain.CurrentDomain.GetAssemblies() .Any(asm => asm.FullName.StartsWith("Microsoft.AspNetCore.")); if (isAspNetCore) { // 注意:这里如果用静态方法,需要通过服务定位器获取IConfiguration(不推荐长期使用,只是临时过渡) var configuration = ServiceLocator.GetService<IConfiguration>(); return configuration[key]; } else { // 传统ASP.NET读取Web.config return System.Configuration.ConfigurationManager.AppSettings[key]; } } }
注意:服务定位器(ServiceLocator)属于反模式,会降低代码的可测试性和可维护性,建议只是作为过渡方案,后续逐步重构为依赖注入。
额外注意事项
- 对于ASP.NET Core完整框架项目,确保
appsettings.json的“复制到输出目录”属性设置为“如果较新则复制”,否则运行时可能找不到配置文件 - CL3作为.NET Framework类库,ASP.NET Core完整框架项目可以直接引用,不存在兼容性问题
- 如果需要读取强类型配置,ASP.NET Core的
IConfiguration支持绑定到实体类,你可以在AppSettingsReader中扩展对应的方法
内容的提问来源于stack exchange,提问作者Florin-Constantin Ciubotariu
相关产品推荐
相关产品推荐

