文章目录
概要
AspNetCore项目中配置文件是有appsettings和appsettings.dev来区分是开发环境还是生产环境。但是在WPF或者framework项目中是没有这个的,默认是只有App.config,那咱们如何实现像AspNetCore做到类似的效果呢?本次分享就是基于一个framework的控制台项目实现配置文件的快速切换。
对于配置文件这个如果咱们的项目比较简单,配置比较少还好,就每次发布之前就手动去注释/取消注释这种操作嘛。但是对于配置多了,咱们项目配置了很多三方系统,中间件。这要是搞漏了,简直太麻烦了。
这个不仅适用于咱们系统的开发环境和生产环境,也适用于我们系统同时有多个客户的情况
整体架构流程
我的整体的设计思路
1、创建两个配置文件appsettings.json和appsettings.dev.json;
2、Autofac作DI,根据配置节点读取配置信息,然后利用json序列化转为对象注册到容器中(单例);
3、
这里比较麻烦的是framework里面,EF使用了db first,DbContext是有T4模板自动生成的。针对这个问题,我的处理方案是利用部分类:(1)新建一个DbCotext部分类,添加一个带参数的构造函数;(2)、DI注册DbContext的时候,实例化DbContext调用那个有参构造函数,这样就可以自定义的去指定连接字符串的来源(统一都放到咱们appsetting中);4、切换配置文件我是App.config中间加了一个AppSettings节点配置来切换
Production/Development,其实你也可以考虑开发电脑真的配个环境变量,服务器上没有这个配置自然识别为生产环境。
- 配置文件
json
//appsettings.json
{
"ConnctionStrings": {
"Default": "server=127.0.0.1;user id=root;password=xxx;database=test_db_20260920_02"
},
"Redis": {
"Host": "192.168.1.1"
}
}
//appsettings.dev.json
{
"ConnctionStrings": {
"Default": "server=127.0.0.1;user id=root;password=xxx;database=test_db_20260920_01"
},
"Redis": {
"Host": "127.0.0.1"
}
}
- 程序入口以及AutofacExtentions
csharp
class Program
{
static void Main(string[] args)
{
var container=new ContainerBuilder()
.AddConfiguration()
.AddServices()
.Build();
var userService=container.Resolve<UserService>();
string userName=userService.QueryUserName(1);
Console.WriteLine($"用户姓名:{userName}");
var redis=container.Resolve<Redis>();
Console.WriteLine($"RedisHost=[{redis.Host}]");
Console.ReadKey();
}
}
csharp
public static class AutofacExtentions
{
private static JObject rootConfig = JObject.Parse(File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(), ConfigurationManager.AppSettings["Environment"] == "Development" ? "appsettings.dev.json" : "appsettings.json")));
public static ContainerBuilder AddConfiguration(this ContainerBuilder containerBuilder)
{
containerBuilder.RegisterInstance(GetAppSettingsSection<ConnctionStrings>());
containerBuilder.RegisterInstance(GetAppSettingsSection<Redis>());
return containerBuilder;
}
private static T GetAppSettingsSection<T>(string key = null) where T : class
{
key = key ?? typeof(T).Name;
return rootConfig[key].ToObject<T>();
}
public static ContainerBuilder AddServices(this ContainerBuilder containerBuilder)
{
containerBuilder.Register(context=>
{
var connctionStrings=context.Resolve<ConnctionStrings>();
return new test_db_20260920_01Entities(new EntityConnectionStringBuilder
{
Metadata = "res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/DataModel.msl",
Provider = "MySql.Data.MySqlClient",
ProviderConnectionString = connctionStrings.Default
}.ConnectionString);
}).InstancePerDependency();
containerBuilder.RegisterType<UserService>().InstancePerDependency();
return containerBuilder;
}
}
- 配置信息的映射类(这个没啥好说的)
csharp
public class ConnctionStrings
{
public string Default { get; set; }
}
public class Redis
{
public string Host { get; set; }
}
- 自定一个DbContext的部分类
csharp
public partial class test_db_20260920_01Entities
{
public test_db_20260920_01Entities(string connectionString)
: base(connectionString)
{
}
}
