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

        }
    }
相关推荐
Y3815326622 天前
C# 调用谷歌搜索 API:HttpClient 与 System.Text.Json 实战
搜索引擎·.net
dalong102 天前
WPF:Modbus 状态监控
wpf·modbus
qq_410194292 天前
.NET 8.0 下基于 PaddleOCRSharp 的离线文字识别落地指南
算法·.net
He BianGu3 天前
【WPF-VisionMaster】机器视觉通用平台V5.0版本发行说明
opencv·c#·wpf·halcon·机器视觉·visionmaster
唐青枫4 天前
别急着拆服务:C#.NET 微服务架构从边界设计到实战
c#·.net
唐青枫5 天前
别把 Razor 当成几段 HTML:C#.NET Razor Pages、MVC 视图与实战详解
c#·.net
宝桥南山5 天前
Microsoft Fabric - 简单尝试一下Microsoft Fabric .NET SDK
microsoft·微软·.net·.netcore·powerbi·fabric
Lost of 程序猿5 天前
.NET 10 船端单机部署与离线升级实战:从闪退事故到无感回滚
c#·asp.net·.net
慧都小妮子5 天前
Word/Excel/PPT 如何稳定导出 Markdown?文档 SDK 三线能力拆解
.net·markdown·知识库·aspose·rag·文档转换·文档互操作