通过两篇博文,我们了解到,反射是通过非实例化(new)的手段来对对象和对象内的成员访问的,不仅仅如此,反射还可以突破访问修饰符的限制,以上帝视角来窥探对象内部全部成员(字段,属性,方法),包括private成员,这样一来,为我们从另外一个层次去设计程序架构,松散模块耦合,提供了强大而有力的支撑。

本篇博文案例,分离的更彻底,完全上帝视角,说一下前情提要:对于His厂商来说,自己的His只有一份,但His要对接的医保有可能千变万化,His不可能要对接全部医保,所以这里要解耦,那首先要定义一个接口,来完成规范的定义,只要His和医保接口都符合这个规范就行,于是接口出现了:

using System;namespace HisMedical
{/// <summary>/// HIS/// </summary>public interface IHis{/// <summary>/// his登记号/// </summary>string RegisterID { set; }/// <summary>/// 住院登记/// </summary>/// <returns></returns>dynamic Register();/// <summary>/// 缴费/// </summary>/// <returns></returns>dynamic Fee();}
}

这个接口封装成一个单独的dll 叫HisMedical.dll

His中首先要实现这个接口,完成His中所有动作的连动调用,这里做了两个动态,一个是登记住院,一个是住院缴费:

        /// <summary>/// his登记住院/// </summary>/// <param name="his"></param>/// <returns></returns>static string Register(IHis his){var registerID = DateTime.Now.ToString("yyyyMMddHHmmss");Console.WriteLine($"*****完成His的登记,登记号:{registerID}");his.RegisterID = registerID;var result = his.Register();return registerID;}/// <summary>/// his缴费/// </summary>/// <param name="his"></param>/// <param name="registerID"></param>/// <returns></returns>static bool Fee(IHis his, string registerID){Console.WriteLine($"*****完成His的结算,登记号:{registerID}");his.RegisterID = registerID;var result = his.Fee();return true;}

接下来实现医保接口的dll就可以了:

先看个东软的:

using HisMedical;
using System;namespace NeusoftMedical
{/// <summary>/// 东软接口/// </summary>public class NeusoftMedical : IHis{/// <summary>/// his登记号/// </summary>public string RegisterID { set; private get; }/// <summary>/// 缴费/// </summary>/// <returns></returns>public dynamic Fee(){Console.WriteLine("-----完成对东软医保的住院缴费");return true;}/// <summary>/// 住院登记/// </summary>/// <returns></returns>public dynamic Register(){Console.WriteLine("-----完成对东软医保的住院登记");return true;}}
}

再看个银海的:

using HisMedical;
using System;namespace YiHaiMedical
{/// <summary>/// 银海接口/// </summary>public class YinHaiMedical : IHis{/// <summary>/// his登记号/// </summary>public string RegisterID { set; private get; }/// <summary>/// 缴费/// </summary>/// <returns></returns>public dynamic Fee(){Console.WriteLine("=====完成对银海医保的住院缴费");return true;}/// <summary>/// 住院登记/// </summary>/// <returns></returns>public dynamic Register(){Console.WriteLine("=====完成对银海医保的住院登记");return true;}}
}

每个接口的实现,依赖RegisterID从His的读库中组织对应的数据就ok,最大限度的与His解耦。

His中究竟是怎么调用不同的接口呢?我们可以把医保的dll的路径配置到一个表里,或配置文件里,当His启动时,自动加载这些dll就ok了,看代码怎么加载。

       static void Main(string[] args){while (true){Console.WriteLine("1、东软  2、银海");var no = Console.ReadLine();Console.WriteLine("1、住院登记   2、住院结算");var busNo = Console.ReadLine();var path = "";switch (no){case "1":path = @"C:\MyFile\Source\Repos\Asp.NetCoreExperiment\Asp.NetCoreExperiment\Architecture\NeusoftMedical\bin\Debug\netstandard2.0\NeusoftMedical.dll";break;case "2":path = @"C:\MyFile\Source\Repos\Asp.NetCoreExperiment\Asp.NetCoreExperiment\Architecture\YiHaiMedical\bin\Debug\netstandard2.0\YiHaiMedical.dll";break;}//从文件加载应用程序集并得到具体类型var medicalType = Assembly.LoadFile(path).GetTypes().FirstOrDefault(t => t.GetInterfaces().Where(s => s.Name == "IHis").Count() > 0);IHis his = (IHis)Activator.CreateInstance(medicalType);var registerID = "";switch (busNo){case "1":registerID = Register(his);break;case "2":if (registerID != ""){Fee(his, registerID);}else{Console.WriteLine("请先登记住院");}break;}}}

代码中第一个switch是医保接口选择,看从配置文件中加载那个接口,第二个switch相当于His中执行的某个操作。不难看出通过反射加载dll,最大限度上解耦了His与医保接口,以后有什么新医保接口要对接,对His来说无感(本例中有可能不是无感的,因为这只是一个简单的代码,关于医保异步调用,还有特殊接口对应等,都没有实现)。

通过三篇博文,我们简单看了一下反射的能力,可以让架构人员自由发挥,前两篇,通过集中开发两个转换方法,其他开发都成了体力活(初级程序员就能实现),本篇更让架构师不管具体医保接口的实现,轻松应实现对接,所以说:反射,架构人员法宝

.NET架构小技巧(5)——反射,架构人员法宝III相关推荐

  1. .NET架构小技巧(6)——什么是好的架构

    首先声明,可能本篇文章的含金量配不上这个标题,因为说起架构,可能大家都比较关注高大上的架构,比如分布式的,高并发的,低耦合的,易扩展的等等,本篇可能使你失望了,因为这些全没有,这篇博客的中心思想是-- ...

  2. 如何设置打印的时候不加上页面链接_excel表格的这10个打印小技巧,办公室财务人员记得收藏...

    打印工作表是日常工作中最常见的一个工作,也是Excel在工作中最常用的一个地方,如何做到快速准确地打印文件呢.今天文理会计小编给大家从网上整理了几个打印文件的小技巧. 1.打印标题 打印的工作表的数据 ...

  3. .NET架构小技巧(4)——反射,架构人员法宝II

    上一篇博文中,利用属性反射的特点,用两个方法完成了字符转实体,实体转字符的工作,但有些复杂的场景,上面方法就没那么好用了,就需要更复杂的方式来组装处理. 先来看一个接口文档,下面是接口的调用方式 lo ...

  4. .NET架构小技巧(7)——做好小的项目

    一屋不扫,何以扫天下.再说也没有那么多天下(大系统)可扫,更多的是一个个自己居住的小屋(手边的小项目,子模块),所以认真的开始扫自己的小屋. 在visual studio中,解决方案(Solution ...

  5. .NET架构小技巧(8)——优待异常

    天有不测风云,人有旦夕祸福,程序呢--会有异常错误. C#中用try,catch,finally来捕捉处理异常,捕捉谁的异常呢?一般都是系统类库或三方类库中抛出的异常,那如果我自己架构程序,异常也是要 ...

  6. .NET架构小技巧(2)——访问修饰符正确姿势

    在C#中,访问修饰符是使用频率很高的一组关键字,一共四个单词六个组合:public,internal,protected internal,protected,private protected,pr ...

  7. 一些你可能不知道的 Python 小技巧!

    [CSDN 编者按]Python 风头正盛,未来一段时间内想必也会是热门编程语言之一.因此,熟练掌握 Python 对开发者来说极其重要,说不定能给作为开发者的你带来意想不到的财富. 作者 | Seb ...

  8. 一个 15 年 SAP ABAP 开发人员分享的 SAPGUI 一些个性化设置和实用小技巧试读版

    零基础 ABAP 学习教程系列文章的目录 ABAP 标准培训教程 BC400 学习笔记之一:ABAP 服务器的架构和一个典型的 ABAP 程序结构介绍 ABAP 标准培训教程 BC400 学习笔记之二 ...

  9. 6000星人气深度学习资源!架构模型技巧全都有,图灵奖得主LeCun推荐

    铜灵 发自 凹非寺 量子位 出品 | 公众号 QbitAI 暑假即将到来,不用来充电学习岂不是亏大了. 有这么一份干货,汇集了机器学习架构和模型的经典知识点,还有各种TensorFlow和PyTorc ...

最新文章

  1. java后端判断用户是否关注公众号
  2. win10终端仿真程序_win10下子系统的使用
  3. Add Binary
  4. C#——《C#语言程序设计》实验报告——继承与多态——电视和电灯委托
  5. 计算机会计学ufo报表,ufo报表实验报告(共10篇).doc
  6. Vue移动端项目——搜索联想建议功能的实现(结合watch属性和使用lodash防抖节流)
  7. 终于!华为在欧盟注册新商标“Harmony”;亚马逊AWS宣布张文翊“新官上任”;甲骨文失去竞购100亿美元国防部云计算合同资格...
  8. c语言程序设计实验二模板,C语言程序设计实验二.doc
  9. textBox的Key_Down事件
  10. web后端语言_web前端学习路线图_快速入门web前端学习路线图
  11. pandas的离散化,面元划分
  12. CF1399D Binary String To Subsequences
  13. 计算机学报应用研究,计算机学报论文_计算机学报_通信学报
  14. 手机上实现划词朗读功能
  15. 蔡勒(Zeller)公式及其推导:快速将任意日期转换为星期数
  16. linux删除某条历史命令,如何从Linux/Unix Bash shell上删除历史记录中的一条命令?...
  17. 用python设置背景音乐_用Python设置
  18. 整理苹果官网上iOS的各种辅助功能
  19. 2022-2028全球与中国机场自助服务市场现状及未来发展趋势
  20. Attention 二 创新篇

热门文章

  1. 【重大更新】DevExpress v17.2新版亮点—Bootstrap篇(二)
  2. 神奇的幻方2015提高组d1t1
  3. 【工具】PC端调试手机端 Html 页面的工具
  4. poj 2886 Who Gets the Most Candies?(线段树)
  5. Installing OpenCV 2.3.1 in Ubuntu
  6. ASP.NET 视频截图功能的C#代码
  7. 如何获取租户中所有的Team
  8. 浏览器自动化操作标准--WebDriver
  9. [转载]C/C++框架和库
  10. linux下redis安装