.net framework开发环境正式环境配置文件的切换

文章目录

概要

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)
        {

        }
    }
相关推荐
光泽雨16 小时前
WPF中的依赖属性
wpf
海马17 小时前
Spring Cloud 开发知识整理
spring·spring cloud·wpf
闻哥18 小时前
分布式任务调度框架:XXL-Job / ElasticJob / DolphinScheduler / SchedulerX 架构对比与选型
分布式·架构·wpf
波力海苔夹心脆6751 天前
C# 机器视觉实战:单相机引导机械手精准贴合,从拍照、偏差计算(平移+旋转)到坐标补偿全解
开发语言·经验分享·数码相机·c#·视觉检测·.net
慧都小妮子1 天前
Stimulsoft 2026.4 发布:Markdown 组件、桑基图与 .NET 11 支持
.net·数据可视化·stimulsoft·版本更新·报表控件·桑基图·.net 11
预立科技1 天前
CDN(内容分发网络)知识总结
网络·wpf·cdn
波力海苔夹心脆6752 天前
C# 视觉检测实战:PLC 按钮触发 VisionPro 检测,OK 亮灯 / NG 灭灯(西门子 PLC,含界面显示与图片存档)
开发语言·经验分享·c#·自动化·视觉检测·.net
hez20102 天前
一行代码在 .NET 项目里启用 Satori GC
c#·.net·.net core·gc·clr
FuckPatience2 天前
WPF DataGrid 行根据某个属性循环变色动画
wpf
QUDONG_biubiubiu2 天前
.NET Runtime 6.0/7.0/8.0/9.0下载修复教程,软件打不开这样解决
.net·net runtime下载·net运行库修复·net runtime安装