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

通过两篇博文,我们了解到,反射是通过非实例化(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来说无感(本例中有可能不是无感的,因为这只是一个简单的代码,关于医保异步调用,还有特殊接口对应等,都没有实现)。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分类计数原理与分步计数原理_《分类计数原理与分步计数原理》优秀说课稿

《分类计数原理与分步计数原理》优秀说课稿一、本节内容的地位与重要性“分类计数原理与分步计数原理”是《高中数学》一节独特内容。这一节课与排列、组合的基本概念有着紧密的联系&#xff0c;通过对这一节课的学习&#xff0c;既可以让学生接受、理解分类计数原理与分步计数…

新版本 Swashbuckle swagger 组件中的 坑

新版本 Swashbuckle swagger 组件中的 Servers 坑Intro上周做了公司的项目升级&#xff0c;从 2.2 更新到 3.1&#xff0c; swagger 直接更新到了最新&#xff0c;swagger 用的组件是 Swashbuckle.AspNetCore&#xff0c;然后遇到一个 swagger 的问题&#xff0c; 在本地测试是…

后端学习 - MySQL存储引擎、索引与事务

文章目录一 存储引擎1 MyISAM 与 InnoDB 的差异二 索引1 主键索引与二级索引、索引覆盖、延迟关联2 聚簇索引与非聚簇索引3 数据结构3.1 哈希表3.2 B树3.3 B树3.4 跳表3.5 为什么不使用红黑树3.6 为什么不使用B树**4 索引下推 ICP **5 索引失效&#xff08;索引不命中&#xff…

itext设置pdf的尺寸_如何获取pdf文档iText 7的页面大小-问答-阿里云开发者社区-阿里云...

我在iText 7中有一个Java程序&#xff0c;可以接收JSON数据并生成一个PDF文档(带有页眉和页脚)&#xff0c;该文档可以很好地处理clientData注释中的变量中的数据&#xff0c;但是当在无注释clientData中使用变量不起作用时&#xff0c;我得到了此错误java.lang.NullPointerExc…

. NET5正式版本月来袭,为什么说gRPC大有可为?

当前企业正在慢慢改用微服务架构来构建面向未来的应用程序&#xff0c;微服务使企业能够有效管理基础架构&#xff0c;轻松部署更新或改进&#xff0c;并帮助IT团队的创新和学习。它还可以帮助企业能够设计出可以轻松按需扩展的应用程序&#xff0c;此外&#xff0c;随着企业转…

宝塔部署node项目_宝塔面板部署 node.js 项目

安装&#xff1a; Nginx 1.16.1安装&#xff1a;MySQL 5.5.62安装&#xff1a;PM2管理器 4.2.3Nginx 配置如下&#xff1a;user www www;worker_processes auto;error_log /www/wwwlogs/nginx_error.log crit;pid /www/server/nginx/logs/nginx.pid;worker_rlimit_nofile 51200…

后端学习 - 操作系统

文章目录一 基本概念1 操作系统的特征2 操作系统的位置3 计算机的硬件组成4 中断与异常5 系统调用二 进程管理1 进程控制块 PCB&#xff08;Process Control Block&#xff09;2 进程的状态与转换3 进程间的通信4 线程5 调度算法6 死锁7 PV 操作三 内存管理1 内存的非连续分配2…

西门子触摸屏脚本程序_通过驿唐PLC501远程下载Smart Line触摸屏

通过驿唐PLC-501远程下载Smart Line触摸屏一、触摸屏设置将PLC-501和Smart 700 IE V3通过网线连到一起。触摸屏上电后&#xff0c;点击Control Panel进入控制面板界面。进入控制面板后&#xff0c;点击Ethernet设置IP地址&#xff0c;与PLC-501联网宝在同一个网段。联网宝的IP地…

.NET for Apache Spark 1.0 版本发布

.NET for Apache Spark 1.0 现已发布&#xff0c;这是一个用于 Spark 大数据的 .NET 框架&#xff0c;可以让 .NET 开发者轻松地使用 Apache Spark。该软件包由微软和 .NET Foundation 牵头&#xff0c;经过大约两年的开发。在 2019 年的 Spark AI 峰会上&#xff0c;微软曾宣…

算法 - 排序算法

文章目录1 快速排序2 堆排序3.冒泡排序4.选择排序5.插入排序1 快速排序 时间复杂度 O(nlogn)不稳定在大多数情况下都是适用的&#xff0c;尤其在数据量大的时候性能优越性更加明显 def quicksort(start, end, nums):if start > end:return flag nums[start]r_ptr endl_pt…

fillrect不填充被覆盖的区域 mfc_quot;条带覆盖quot;猜想的中二证明:quot;球面条线覆盖或点覆盖quot;积分π...

注销&#xff1a;“黎曼猜想”复平面质数单向“虚”圆柱螺旋&#xff1a;几何法证明&#xff0c;技术应用​zhuanlan.zhihu.com假设有这样一部针点打印机从球心对球面打印&#xff0c;外部有一台蓝牙打印&#xff0c;球面打印蓝牙条带打印同步&#xff0c;球面被覆盖&#xff0…

让你变厉害的7个底层思维

职场&认知洞察 丨 作者 / findyi这是findyi公众号分享的第89篇原创文章如果把你的思维比做操作系统&#xff0c;那思维模型就是一个个App。这些App会给你提供新的视角&#xff0c;快速帮你决策&#xff0c;提升你的工作效率。顶级的思维模型能提高你成功的可能性&#xff0…

后端学习 - 计算机网络

文章目录一 基本概念1 计算机网络体系结构2 时延二 应用层&#xff1a;HTTP1 请求和响应报文、常见 header2 URL & RESTful API3 HTTP 协议通信过程4 HTTP 方法5 HTTP 状态码6 短连接、长连接与流水线7 Cookie8 Session三 应用层&#xff1a;HTTPS1 加密方式2 证书认证四 应…

跟我一起学Redis之Redis配置文件啃了一遍之后,从尴尬变得有底气了(总结了一张思维图)...

前言秋高气爽的一天&#xff0c;那时候年轻帅气的我正在参照着搜索引擎写代码&#xff0c;迷之微笑般的敲着键盘(又从搜索引擎上找到代码案例啦)&#xff0c;突然领导在小隔间里传来了呼唤声&#xff0c;然后有了以下场景&#xff1a;领导&#xff1a;小Z&#xff0c;你过来一下…

1093芯片做正弦波逆变器_长途自驾游“缺电”如何选购正确车载逆变器,避开商家套路...

让车友三分钟就能看明白如何选择车用逆变器&#xff0c;节约车友时间。长途自驾游充电是一个难题&#xff0c;手机充电还好办&#xff0c;其他笔记本、电饭煲、车载冰箱或者无人机电池等充电就会用到220V电源&#xff0c;那就必须用到逆变器(逆变器就是将12V或24V直流电&#x…

Spring 相关问题

文章目录Spring1 Spring 框架中用到的设计模式2 Spring 事务、隔离级别3 单例 Bean 是线程安全的吗Spring IOC1 Spring 容器&#xff1a;BeanFactory & ApplicationContext2 依赖注入的两种方式3 Bean 的生命周期4 依赖注入的四个注解5 如何解决循环依赖Spring AOP1 基本概…

达梦php_pdo不同机器安装

现象 extensionphp74_pdo_dm.so extensionlibphp74_dm.so 普通安装达梦pdo.so后运行php报错&#xff1a;Unable to start PDO_DM module in Unknown on line 0 机器上没有达梦服务器环境。 步骤&#xff1a; 1. 拷贝达梦php_pdo到php拓展目录下&#xff0c;更新php.ini。…

ndr4108贴片晶振是多少频率_关于山羊挺身你知道多少?这些干货速来了解一下...

就是因为有些人愿意吃苦&#xff0c;有些人缺乏决心毅力&#xff0c;才会有成功和失败之分。身材不是一天不运动或一天乱吃所造成&#xff0c;瘦身健身的效果也不是一天的努力可以看出来的。如同学业、事业&#xff0c;成功都不是一条直线&#xff0c;而是一条上上下下的崎岖路…

BeetleX之Websocket服务使用

BeetleX.FastHttpApi不仅是一个Webapi服务组件&#xff0c;它同时也是一个Websocket服务组件。由于BeetleX.FastHttpApi的实现是直接支持Websocket Upgrade操作&#xff0c;所以当启动服务后是HTTP还是Websocket完全取决于请求方&#xff1b;其原理和aspcore一样&#xff0c;同…

22日常实习面试记录

最后去快手了 文章目录字节跳动 后端开发实习生-新业务 一面TCL 鸿鹄实验室 一面字节跳动 飞书后端 一面快手 Java信息安全 一面快手 Java信息安全 二面快手 Java信息安全 三面比特大陆 软件开发实习生 一面比特大陆 软件开发实习生 二面字节跳动 后端开发实习生-新业务 一面 算…