生活随笔
收集整理的這篇文章主要介紹了
.NET架构小技巧(5)——反射,架构人员法宝III
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
通過(guò)兩篇博文,我們了解到,反射是通過(guò)非實(shí)例化(new)的手段來(lái)對(duì)對(duì)象和對(duì)象內(nèi)的成員訪問(wèn)的,不僅僅如此,反射還可以突破訪問(wèn)修飾符的限制,以上帝視角來(lái)窺探對(duì)象內(nèi)部全部成員(字段,屬性,方法),包括private成員,這樣一來(lái),為我們從另外一個(gè)層次去設(shè)計(jì)程序架構(gòu),松散模塊耦合,提供了強(qiáng)大而有力的支撐。
本篇博文案例,分離的更徹底,完全上帝視角,說(shuō)一下前情提要:對(duì)于His廠商來(lái)說(shuō),自己的His只有一份,但His要對(duì)接的醫(yī)保有可能千變?nèi)f化,His不可能要對(duì)接全部醫(yī)保,所以這里要解耦,那首先要定義一個(gè)接口,來(lái)完成規(guī)范的定義,只要His和醫(yī)保接口都符合這個(gè)規(guī)范就行,于是接口出現(xiàn)了:
using System;namespace HisMedical
{/// <summary>/// HIS/// </summary>public interface IHis{/// <summary>/// his登記號(hào)/// </summary>string RegisterID { set; }/// <summary>/// 住院登記/// </summary>/// <returns></returns>dynamic Register();/// <summary>/// 繳費(fèi)/// </summary>/// <returns></returns>dynamic Fee();}
}
這個(gè)接口封裝成一個(gè)單獨(dú)的dll?叫HisMedical.dll
His中首先要實(shí)現(xiàn)這個(gè)接口,完成His中所有動(dòng)作的連動(dòng)調(diào)用,這里做了兩個(gè)動(dòng)態(tài),一個(gè)是登記住院,一個(gè)是住院繳費(fèi):
/// <summary>/// his登記住院/// </summary>/// <param name="his"></param>/// <returns></returns>static string Register(IHis his){var registerID = DateTime.Now.ToString("yyyyMMddHHmmss");Console.WriteLine($"*****完成His的登記,登記號(hào):{registerID}");his.RegisterID = registerID;var result = his.Register();return registerID;}/// <summary>/// his繳費(fèi)/// </summary>/// <param name="his"></param>/// <param name="registerID"></param>/// <returns></returns>static bool Fee(IHis his, string registerID){Console.WriteLine($"*****完成His的結(jié)算,登記號(hào):{registerID}");his.RegisterID = registerID;var result = his.Fee();return true;}
接下來(lái)實(shí)現(xiàn)醫(yī)保接口的dll就可以了:
先看個(gè)東軟的:
using HisMedical;
using System;namespace NeusoftMedical
{/// <summary>/// 東軟接口/// </summary>public class NeusoftMedical : IHis{/// <summary>/// his登記號(hào)/// </summary>public string RegisterID { set; private get; }/// <summary>/// 繳費(fèi)/// </summary>/// <returns></returns>public dynamic Fee(){Console.WriteLine("-----完成對(duì)東軟醫(yī)保的住院繳費(fèi)");return true;}/// <summary>/// 住院登記/// </summary>/// <returns></returns>public dynamic Register(){Console.WriteLine("-----完成對(duì)東軟醫(yī)保的住院登記");return true;}}
}
再看個(gè)銀海的:
using HisMedical;
using System;namespace YiHaiMedical
{/// <summary>/// 銀海接口/// </summary>public class YinHaiMedical : IHis{/// <summary>/// his登記號(hào)/// </summary>public string RegisterID { set; private get; }/// <summary>/// 繳費(fèi)/// </summary>/// <returns></returns>public dynamic Fee(){Console.WriteLine("=====完成對(duì)銀海醫(yī)保的住院繳費(fèi)");return true;}/// <summary>/// 住院登記/// </summary>/// <returns></returns>public dynamic Register(){Console.WriteLine("=====完成對(duì)銀海醫(yī)保的住院登記");return true;}}
}
每個(gè)接口的實(shí)現(xiàn),依賴RegisterID從His的讀庫(kù)中組織對(duì)應(yīng)的數(shù)據(jù)就ok,最大限度的與His解耦。
His中究竟是怎么調(diào)用不同的接口呢?我們可以把醫(yī)保的dll的路徑配置到一個(gè)表里,或配置文件里,當(dāng)His啟動(dòng)時(shí),自動(dòng)加載這些dll就ok了,看代碼怎么加載。
static void Main(string[] args){while (true){Console.WriteLine("1、東軟 2、銀海");var no = Console.ReadLine();Console.WriteLine("1、住院登記 2、住院結(jié)算");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;}//從文件加載應(yīng)用程序集并得到具體類型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("請(qǐng)先登記住院");}break;}}}
代碼中第一個(gè)switch是醫(yī)保接口選擇,看從配置文件中加載那個(gè)接口,第二個(gè)switch相當(dāng)于His中執(zhí)行的某個(gè)操作。不難看出通過(guò)反射加載dll,最大限度上解耦了His與醫(yī)保接口,以后有什么新醫(yī)保接口要對(duì)接,對(duì)His來(lái)說(shuō)無(wú)感(本例中有可能不是無(wú)感的,因?yàn)檫@只是一個(gè)簡(jiǎn)單的代碼,關(guān)于醫(yī)保異步調(diào)用,還有特殊接口對(duì)應(yīng)等,都沒(méi)有實(shí)現(xiàn))。
通過(guò)三篇博文,我們簡(jiǎn)單看了一下反射的能力,可以讓架構(gòu)人員自由發(fā)揮,前兩篇,通過(guò)集中開(kāi)發(fā)兩個(gè)轉(zhuǎn)換方法,其他開(kāi)發(fā)都成了體力活(初級(jí)程序員就能實(shí)現(xiàn)),本篇更讓架構(gòu)師不管具體醫(yī)保接口的實(shí)現(xiàn),輕松應(yīng)實(shí)現(xiàn)對(duì)接,所以說(shuō):反射,架構(gòu)人員法寶
總結(jié)
以上是生活随笔為你收集整理的.NET架构小技巧(5)——反射,架构人员法宝III的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。