反射解决了什么问题

简介: 反射解决了什么问题及应用场景反射总结目录上篇介绍了什么是反射以及FCl中反射的实现,这篇我们来讨进一步讨论反射解决的问题及其应用场景。在软件开发的过程中我们经常遇见一些相同的问题,比如访问数据库,我们知道数据库的种类繁多,每家数据库供应商都提供了不通的API实现,这就决定我们在软件开发过程中就需要考虑使用的是哪家的数据库他们的API又是什么样子的,这也就产生了依赖关系。

反射解决了什么问题及应用场景

上篇介绍了什么是反射以及FCl中反射的实现,这篇我们来讨进一步讨论反射解决的问题及其应用场景。

在软件开发的过程中我们经常遇见一些相同的问题,比如访问数据库,我们知道数据库的种类繁多,每家数据库供应商都提供了不通的API实现,这就决定我们在软件开发过程中就需要考虑使用的是哪家的数据库他们的API又是什么样子的,这也就产生了依赖关系。
那么问题来了,我们能不能实现一种办法来解决这种依赖关系?

下面列举一个例子:

var dbProvider = ""; //mssql,mysql,sqlite
IDbConnection conn = null;
switch (dbProvider)
{
    case "mssql":
        conn =new SqlConnction("数据库链接串");
        break;
    case "mysql":
        conn = new MySqlConnction("数据库链接串");
        break;
    case "sqlite":
        conn = new SqliteConnction("数据链接串");
        break;  
}
conn.Open();

上面的代码,我们访问了三种数据库,通过工厂方法模式实现了数据库的选择,如果我们只使用这三种数据库,那么这段代码没有什么问题。
如果现在有需求要加入对pgsql数据库的支持,我们需要怎么办呢?有一种实现,我们修改代码,添加case返回pg的IDBConnection实现并重新编译代码然后发布。这看起来没有什么难处,不就是添加几行代码做几次编译发布吗?没有什么大不了的!如果要删除某一个数据库的支持呢。。。。。。
这个问题看起来简单,但类似的业务场景有很多,如果都这样解决,那只是把脑力劳动变成了体力劳动。(程序员都很懒,起码我是这样)。

下面是我的改进方案:

通过参数化的配置实现了类库的动态加载,反射查到需要的类型并使用。
var dbConfig = new
{
    Name = "mssql", //mssql,mysql,sqlite,pgsql,oracle,access等数据库
    ConnName = "SqlConnection",
    ConnStr = "数据库链接字符串"
};

var connType = Assembly.LoadFile($"*/{dbConfig.Name}.dll").GetType(dbConfig.ConnName);
IDbConnection  conn =(IDbConnection)Activator.CreateInstance(connType, dbConfig.ConnStr);
conn.Open();
这不是一个能说明反射的好例子,因为我们不可能同时使用多种数据库,而且数据库的切换也不可能频繁,这个例子只是为了说明怎么通过反射来实现一些功能,希望各位观众不要被这个例子误导。

反射解决了什么问题?

在面向对象的世界中如果你不懂得一点反射知识是很难做到低耦合的。比如现在IOC框架本质就是利用反射技术来实现解耦的效果。
  1. 动态加载,按需加载程序集
  2. 解耦
  3. 提高组件的复用性
  4. 解决了最主要的问题就是装13

反射的应用场景

  1. Visual Studio中开发C#时通过反射实现智能感知效果
  2. IOC是反射的最好应用

我在项目中怎么使用反射

使用反射实现数据访问层的抽象。
数据访问层的接口实现
public interface IBaseDAO { }

public interface IClientDAO : IBaseDAO
{
    List GetClientIds();

    ClientEntity GetClientInfo(int cId);
}

//反射获取接口的实现
public class DAOHelper
{
    public static Dictionary daoDict = new Dictionary();

    public static T Create() where T : IBaseDAO
    {

        if (daoDict.ContainsKey(typeof(T)))
        {
            Type t = daoDict[typeof(T)];
            return (T)Activator.CreateInstance(t);
        }

        var assembly=Assembly.Load("ReflectionAssembly");
        var type = assembly.ExportedTypes.FirstOrDefault(item => item.GetInterface(typeof(T).FullName) == typeof(T));
        if (type == null)
        {
            throw new NotImplementedException($"{typeof(T).FullName}接口未实现");
        }
        //演示,没有添加lock
        daoDict.Add(typeof(T), type);
        return (T)Activator.CreateInstance(type);
    }
}
实现数据访问层接口
namespace ReflectionAssembly
{
    public class ClientDAO : IClientDAO
    {
        public List GetClientIds()
        {
            return new List { 1, 2, 3, 4 };
        }

        public ClientEntity GetClientInfo(int cId)
        {
            return new ClientEntity();
        }
    }
}
数据实体层
public class ClientEntity
{
}
业务层
var clientDAO=DAOHelper.Create();
clientDAO.GetClientIds();
clientDAO.GetClientInfo(1);
上面这段代码就是我在项目中通过反射实现,处于演示的目的,很多情况都没有列出,比如多线程下锁的处理、如何加速等。

小结

上面两个例子演示了如何在项目中使用反射,并列举了反射可以帮助我们解决什么问题,有些概念可能模糊不清或者不是很贴切,希望阅读本文章的兄弟不吝赐教。
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
Shell 网络安全 数据安全/隐私保护
|
10月前
|
JSON 数据挖掘 API
lazada商品详情接口 (lazada API系列)
Lazada 是东南亚知名电商平台,提供海量商品资源。通过其商品详情接口,开发者和商家可获取商品标题、价格、库存、描述、图片、用户评价等详细信息,助力市场竞争分析、商品优化及库存管理。接口采用 HTTP GET 请求,返回 JSON 格式的响应数据,支持 Python 等语言调用。应用场景包括竞品分析、价格趋势研究、用户评价分析及电商应用开发,为企业决策和用户体验提升提供有力支持。
380 21
|
11月前
|
人工智能 安全 Java
微服务引擎 MSE:打造通用的企业级微服务架构
微服务引擎MSE致力于打造通用的企业级微服务架构,涵盖四大核心内容:微服务技术趋势与挑战、MSE应对方案、拥抱开源及最佳实践。MSE通过流量入口、内部流量管理、服务治理等模块,提供高可用、跨语言支持和性能优化。此外,MSE坚持开放,推动云原生与AI融合,助力企业实现无缝迁移和高效运维。
499 1
Vue3信息提示(Modal)
这是一个基于 Vue2 的信息提示模态框组件,支持多种弹窗类型(如 info、success、error 等),并提供丰富的自定义属性,包括按钮文本、按钮类型、居中方式等。该组件可根据内容自动调整高度,并兼容不同按钮样式配置。预览效果展示了不同类型的模态框及其样式。代码中详细介绍了组件的实现方式和使用方法。
477 1
Vue3信息提示(Modal)
|
安全 网络安全 数据安全/隐私保护
IP SSL证书:更适合公网宝宝体质的安全证书
在数字化时代,数据安全至关重要。SSL证书作为保障数据传输安全的“数字锁”,其中的公网IP SSL证书特别适用于仅有公网IP地址而无域名的情况,提供HTTPS加密及服务器身份验证,确保数据安全。申请过程简单,适用于服务器托管、内网对外服务及临时站点等多种场景。
|
机器学习/深度学习 算法 数据挖掘
基于WOA优化的CNN-LSTM的时间序列回归预测matlab仿真
本项目采用MATLAB 2022a实现时间序列预测,利用CNN与LSTM结合的优势,并以鲸鱼优化算法(WOA)优化模型超参数。CNN提取时间序列的局部特征,LSTM处理长期依赖关系,而WOA确保参数最优配置以提高预测准确性。完整代码附带中文注释及操作指南,运行效果无水印展示。
简单好用的图片取色器【可取RGB数值】
这篇文章介绍了如何使用Snipaste工具进行截图和取色,包括按下快捷键F1截图、选择图片区域、移动鼠标取色以及复制颜色值的步骤,并提供了操作界面的截图。
|
jenkins Java 持续交付
Docker Swarm总结+Jenkins安装配置与集成(5/5)
Docker Swarm总结+Jenkins安装配置与集成(5/5)
413 0
网络中的半双工与全双工
【8月更文挑战第24天】
2606 0
|
存储 人工智能 算法
数据安全与隐私保护在人工智能时代的挑战与应对
随着人工智能技术的快速发展,数据安全和隐私保护问题日益凸显。本文将探讨在人工智能时代下,数据安全面临的挑战以及如何有效应对,为保护用户数据和维护信息安全提供新思路。
1923 13