程序集掃描庫(ReferenceScan)
是什麼?
服務間會有各種相互依賴和引用,這勢必會造成爭奪ConfigureServices,到最後牽一髮而動全身。於是很自然的出現了它來解決這個問題,
爲什麼?
爲了解決服務爭奪ConfigureServices註冊順序而誕生的庫,他就是各個服務的帶頭人,一定是它最先註冊
怎麼做?
沒有任何引用,非常簡單
/// <summary> /// 掃描執行接口 /// 掃描後將會執行Execute函數 /// </summary> public abstract class BaseStartExecute { public BaseStartExecute() { } /// <summary> /// 執行函數 /// </summary> public abstract void Execute(); }
這就是前幾節看到的BaseStartExecute
public class Scan { public static void QueryAssemblies<T>() where T : BaseStartExecute { List<T> StartExecutes = new List<T>(); var referenceScanDoMainName = typeof(Scan).Assembly.FullName; foreach (var item in System.AppDomain.CurrentDomain.GetAssemblies()) { if (item.GetReferencedAssemblies().Where(x => x.FullName.Equals(referenceScanDoMainName)).Count() > 0) { StartExecutes.AddRange(CreateAllInstancesOf<T>(item)); } } foreach (var item in StartExecutes) { item.Execute(); } } public static void QueryAssemblies() { List<BaseStartExecute> StartExecutes = new List<BaseStartExecute>(); var referenceScanDoMainName = typeof(Scan).Assembly.FullName; foreach (var item in System.AppDomain.CurrentDomain.GetAssemblies()) { if (item.GetReferencedAssemblies().Where(x => x.FullName.Equals(referenceScanDoMainName)).Count() > 0) { StartExecutes.AddRange(CreateAllInstancesOf<BaseStartExecute>(item)); } } foreach (var item in StartExecutes) { item.Execute(); } } public static IEnumerable<T> CreateAllInstancesOf<T>(Assembly assembly) { return assembly.GetTypes() //獲取當前類庫下所有類型 .Where(t => typeof(T).IsAssignableFrom(t)) //獲取間接或直接繼承t的所有類型 .Where(t => !t.IsAbstract && t.IsClass) //獲取非抽象類 排除接口繼承 .Select(t => (T)Activator.CreateInstance(t)); //創造實例,並返回結果(項目需求,可刪除) } }
很簡單的功能,掃描所有程序集並判斷有沒有引用ReferenceScan,因爲BaseStartExecute在這,所以服務如果想要快人一步必須會要引用ReferenceScan,
然後實例化並執行Execute功能
它在這
很簡單的服務
----
第一部分就到此結束了
很簡單的介紹了下用包來作爲爲服務劃分的SOA架構
後續將會有
1、快速生成基礎設施服務、業務服務、幷包含單元測試,不再需要手動創建
2、nuget的快速交付(CD),也就是推代碼後自動更新版本,自動發佈到倉庫
3、APIDoc.Swagger的支持
4、有狀態的服務
5、異常處理服務
6、操作日誌
7、...