思考一種好的架構(十二)

 

程序集掃描庫(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、...

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章