超简单的C#可配置可扩展基础框架示例

简介: 超简单的C#可配置可扩展基础框架示例

最近猿A开发了一个项目,最初只支持MySQL数据库,所以猿A直接在项目内部定义一个类,并定义其具体实现

#MySqlHelper.cs
public class MySqlHelper
{
     public void Query()
    {
    }
}


使用上,当然更简单了。

//项目最初,只支持MySQL
MySqlHelper mySqlHelper = new MySqlHelper();
mySqlHelper.Query();


隔了1个月,产品说版本升级,支持一下SqlServer吧,然后,猿A就开始想了,你这么搞,难道我再加一个类不成,也不是不行,就是太low了,不过既然都是和数据库操作相关的类,干脆我就写个接口,定义数据库操作相关方法,然后定义和数据库相关的类来实现这个接口吧,毕竟也是要成为架构师的人嘛,怎能没有这点小想法。


于是,猿A写了一个接口,定义数据库操作方法

#IDBHelper.cs
public interface IDBHelper
{
    void Query();
    //void Insert();
    //void Update();
    //void Delete();
}


接着,写了2个类MySQLHelper和SQLServerHelper且都继承该接口

#MySqlHelper.cs
public class MySqlHelper:IDBHelper
{
     public void Query()
    {
    }
}
=======
#SqlServerHelper.cs
public class SqlServerHelper : IDBHelper
{
     public void Query()
    {
        //throw new NotImplementedException();
    }
}


这样,客户是哪个数据库,我就生成哪种方式的代码吧。


猿B看到了猿A的写法,大叫一声,“瞎搞”,然后语重心长的说,今天我就再教你一招吧...


小A啊,一般来说,不同的客户采用不同的数据库,甚至可能采用多个不同数据库,那么,我们自然不能在代码实现中,将数据库连接和操作等写成固定的。为啥呢?因为这样的话,那不是的针对每个数据库都得写一套固定的代码吗?如果客户中间要换数据库呢?那不是还得改程序吗?

既然我们做的是产品,当然要做成通用的嘛!首先要保证产品的普适性。当然,像这种情况其实也是很容易处理的,我们只需按如下步骤进行就可以轻松搞定了。


1.借助配置文件,我们可以在配置文件中指定数据库种类,比如这里,我在app.config中通过AppSettings节点,添加了一个key值为IDBHelperConfig的项,项内保存了使用的数据库种类。这样可用于在实例化数据库操作类时用于判断。


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<appSettings>
<add key="IDBHelperConfig" value="MySql"/>
</appSettings>
<connectionStrings>
<!--数据库连接字符串-->
<add name="Customers" connectionString="Data Source=ElevenPC; Database=Customers; User ID=sa; Password=Password; MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>


2.由于所有的数据库操作类都继承了IDBHelper接口,那么你可以定义一个工厂类,其接受一个参数(即配置文件里配置的值),并生成对应的数据库操作类。


这样的话,其实我们就通过配置文件实现了程序的可配置


3.但是,小A你想啊,这次增加一个SQLServer,万一下次还要增加Oracle,增加redis呢?你是不是还得修改代码,那这样的话,我们有没有一种方式能够做到一劳永逸呢,这样的话才能算的上是一个比较好的系统架构,对不对?


猿A说:要增加功能还能不修改代码,有这么神奇的方式吗?


猿B说:你啊,还是太年轻,要增加功能,修改代码肯定是必须的,但是,修改的可能只是业务代码,而跟架构没关系。还记得上次教你的反射吧。反射可以通过程序集名称和类名称来动态的创建对象。这样,如果我们的配置文件配置了数据库操作类及类所在的程序集,那么,我们就可以在工厂方法中通过反射的方式来动态的创建对象。如

<add key="IDBHelperConfig" value="ReflectionDemo,ReflectionDemo.MySqlHelper"/>


SimpleFactory的反射实现如下


public static class SimpleFactory
{
     //通过配置文件,来决定使用哪种数据库
     static string dllName = ConfigurationManager.AppSettings["IDBHelperConfig"].Split(',')[0];
     static string typeName = ConfigurationManager.AppSettings["IDBHelperConfig"].Split(',')[1];
     public static IDBHelper CreateInstance()
    {
        Assembly assembly = Assembly.Load(dllName);
        Type type = assembly.GetType(typeName);
        object o = Activator.CreateInstance(type);
        IDBHelper dBHelper = o as IDBHelper;
         return dBHelper;
    }
}


这样,操作就简单了,我们只需在调用时,调用工厂类方法,创建对象,然后即可调用相应的Query方法了,看上去清爽多了,就跟直接new出的对象是一样的调用方式。

IDBHelper dBHelper = SimpleFactory.CreateInstance();
dBHelper.Query();


即使我们下次需要增加Oracle支持,那么我们也只需将Oracle的全部操作都封装在一个单独的类库里,然后向应用程序提供该类库就可以让原来的程序支持Oracle,这就是程序的可扩展性。你明白了吗?


猿A:哇,真的耶,大佬就是厉害,感谢指点,那这样的话,我赶紧去修改我的代码,我要将接口定义以及对MySQL、SqlServer、Oracle的支持都封装到单独的类库,并且用反射的方式来实现工厂类的方法,然后在通过配置文件来指导工厂方法生产对象。


过了一小会儿...

猿A:大佬,来看一下我这个架构还有什么问题吗?


1694174981536.png


猿B:嗯,这样的实现就对啦。这其实就是一个小型通用的可配置可扩展的架构的实例。简单来说,就是利用配置文件来实现可配置,利用反射的动态加载来实现可扩展。学的不错,继续加油。


就这样,猿A在迷茫的道路上又前进了一步。


源码我放到了GitHub,有需要的请自取


https://github.com/IronMarmot/Samples/tree/master/MyReflection/Reflect
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
8天前
|
人工智能 JSON 安全
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
阿里云AI安全产品联动防御Fastjson攻击
2183 12
Fastjson远程代码执行漏洞,阿里云AI安全为您保驾护航
|
8天前
|
云安全 人工智能 安全
|
8天前
|
人工智能 自然语言处理 数据挖掘
Qwen3.8-Max-Preview深度全解析:2.4万亿参数旗舰MoE模型+Token Plan限时优惠完整落地指南
2026年7月,全新旗舰级混合专家大模型Qwen3.8-Max-Preview正式开放抢先体验,作为通义千问Qwen3系列规格最高、综合推理能力顶尖的新一代模型,该模型总参数量达到2.4万亿(2.4T),是当前线上可调用的原生多模态旗舰模型,综合推理水准对标海外顶级Fable 5模型,在复杂工程开发、长文档深度分析、多步骤智能体自治、跨境多语言创作、海量数据挖掘五大高难度业务场景实现跨越式性能提升。
976 1
|
10天前
|
人工智能
Qwen3.8抢先体验!正式版即将发布并开源!
千问Qwen3.8即将开源,参数达2.4T,进化速度以“天”计,实力媲美Fable 5。预览版Qwen3.8-Max已上线阿里Token Plan等平台,限时优惠:日间Credits低至1折,夜间更优,个人/团队版月付仅35元起!
982 44
|
8天前
|
人工智能 自然语言处理 数据挖掘
最新版通义千问(Qwen3.8-Max-Preview)功能介绍
2026年,通义千问正式推出全新旗舰级大模型 **Qwen3.8-Max-Preview 预览版**,作为首款突破万亿参数规格的新一代基座模型,该模型总参数量达到**2.4万亿**,采用全新迭代的MoE混合专家架构,综合推理性能、长文本处理、多模态理解、复杂任务规划能力全面超越前代Qwen3.7-Max版本,整体实力跻身全球第一梯队,可对标海外顶级旗舰模型,是当前面向复杂工程开发、多智能体协同、超长文档解析、专业办公自动化场景的最优国产基座模型。
983 0
|
6天前
|
自然语言处理 测试技术 API
通义千问Qwen3.8-Max-Preview全功能解析:2.4万亿参数旗舰模型深度使用指南
在大模型技术持续迭代的当下,通义千问推出的Qwen3.8-Max-Preview作为新一代旗舰预览版模型,凭借2.4万亿参数的超大规模、多模态融合能力与全场景适配特性,成为开发者与企业用户探索AI应用的核心工具。该模型采用稀疏混合专家(MoE)架构,是通义千问首个突破万亿参数的多模态模型,可同时处理文本、图像、视频与文档等多种数据形态,在全栈代码开发、复杂逻辑推理、长文档分析与多智能体协作等场景实现跨越式升级。本文将全面拆解Qwen3.8-Max-Preview的核心功能,详解API调用流程与配置方法,覆盖多场景实战技巧,帮助用户快速掌握这款旗舰模型的使用方法,充分释放其性能潜力。
469 1
|
9天前
|
人工智能 自然语言处理 数据挖掘
Qwen3.8-Max 预览版全解析:2.4 万亿参数旗舰模型,Token Plan 限时优惠指南
Qwen3.8-Max-Preview是通义千问Qwen3系列旗舰MoE大模型,参数达2.4万亿,综合推理能力居行业第一梯队。支持思考/快速双模式,擅长大模型五大高难场景。现于阿里云百炼Token Plan、Qoder及QoderWork上线体验,个人版低至39元/月。在阿里云百炼官网:https://t.aliyun.com/U/fPVHqY 免费领取千万Tokens
685 1
Qwen3.8-Max 预览版全解析:2.4 万亿参数旗舰模型,Token Plan 限时优惠指南