生活随笔
收集整理的這篇文章主要介紹了
.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來說無感(本例中有可能不是無感的,因為這只是一個簡單的代碼,關于醫保異步調用,還有特殊接口對應等,都沒有實現)。
通過三篇博文,我們簡單看了一下反射的能力,可以讓架構人員自由發揮,前兩篇,通過集中開發兩個轉換方法,其他開發都成了體力活(初級程序員就能實現),本篇更讓架構師不管具體醫保接口的實現,輕松應實現對接,所以說:反射,架構人員法寶
總結
以上是生活随笔為你收集整理的.NET架构小技巧(5)——反射,架构人员法宝III的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。