Lind.DDD.Plugins~插件模式的集成

来源:http://www.cnblogs.com/lori/archive/2016/10/19/5976348.html
-Advertisement-
Play Games

回到目錄 對於Lind.DDD這個敏捷框架來說,插件也是其中的一個亮點,所有被認為是插件(Plugins)的模塊都會繼承自IPlugins這個標示介面,它在程式啟動時會找到所有插件,並通過autofac註冊到運行時中,然後在使用時通過PluginManager對象進行獲取,即所有模塊只註冊一次,在使 ...


回到目錄

對於Lind.DDD這個敏捷框架來說,插件也是其中的一個亮點,所有被認為是插件(Plugins)的模塊都會繼承自IPlugins這個標示介面,它在程式啟動時會找到所有插件,並通過autofac註冊到運行時中,然後在使用時通過PluginManager對象進行獲取,即所有模塊只註冊一次,在使用時只是從容器中取出實例的過程,這也保證的程式的性能!

Lind.DDD.Plugins設計圖

一個介面,多個實現,根據具體業務,生產不同的實例,生產的過程前制到程式啟動時,後期的使用直接從容器中獲取,由於是key/value結構,所有獲取的時間複雜度為O(1)

PluginModel模型

將需要動態生產,並且後期可能發生改變的插件持久化到資料庫,文件,Nosql中,程式使用時,直接從存儲介質里讀取即可

    /// <summary>
    /// 插件模型
    /// Author:Lind
    /// 可以被持久化到資料庫里,方便松插撥
    /// 根據資料庫的值,生產對應的實例
    /// </summary>
    public class PluginModel : Entity
    {
        /// <summary>
        /// 模塊名稱:對插件進行分類管理
        /// </summary>
        public string ModuleName { get; set; }
        /// <summary>
        /// 類型顯示名稱,模塊下麵的類型列表,一個模塊可以有多種類型
        /// </summary>
        public string TypeName { get; set; }
        /// <summary>
        /// 類型完整路徑,命令名稱+類名
        /// </summary>
        public string TypeFullName { get; set; }
    }

PluginManager插件管理者

沒有Init(),Install()這種初始化的方法,而直接集成到了Config屬性上,當沒有初始化時,直接進行註冊註冊插件,當已經被初始化後,直接返回容器即可,這在程式部署時,變得更加自動化!

    /// <summary>
    /// 可插拔組件的管理者
    /// Author:Lind
    /// 依賴於Autofac
    /// </summary>
    public class PluginManager
    {
        /// <summary>
        /// 插件容器輔助欄位
        /// </summary>
        private static IContainer _container = null;
        /// <summary>
        /// 互斥鎖
        /// </summary>
        private static object lockObj = new object();
        /// <summary>
        /// 類的構造方法
        /// </summary>
        static PluginManager()
        {

            lock (lockObj)
            {
                if (_container == null)
                {
                    lock (lockObj)
                    {
                        try
                        {
                            Console.WriteLine("開始註冊(IPlugins)所有插件...");
                            var builder = new ContainerBuilder();

                            foreach (var item in AssemblyHelper.GetTypesByInterfaces(typeof(IPlugins)))
                            {
                                builder.RegisterType(item)
                                      .Named(item.FullName, item.GetInterfaces().FirstOrDefault());
                            }
                            _container = builder.Build();
                        }
                        catch (Exception)
                        {
                            throw new ArgumentException("PluginManager依賴於autofac包包...");
                        }

                    }
                }
            }

        }
        /// <summary>
        /// 從插件容器里返回對象
        /// </summary>
        /// <param name="serviceName"></param>
        /// <param name="serviceType"></param>
        /// <returns></returns>
        public static object Resolve(string serviceName, Type serviceType)
        {
            return _container.ResolveNamed(serviceName, serviceType);
        }
        /// <summary>
        /// 從插件容器里返回對象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="serviceName"></param>
        /// <returns></returns>
        public static TService Resolve<TService>(string serviceName)
        {
            return _container.ResolveNamed<TService>(serviceName);
        }

    }

通過這個Lind.DDD.Plugins的設計,讓我們再次領略了IoC容器的魅力,當然它的基於還是介面,多態和麵向對象的基本性質,所以,學好基礎才是重中之重!

感謝各位的閱讀,非常各位多多關註倉儲大叔框架

回到目錄


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 下麵是總結的幾個使用方法 include 'PHPExcel.php'; include 'PHPExcel/Writer/Excel2007.php'; //或者include 'PHPExcel/Writer/Excel5.php'; 用於輸出.xls的 創建一個excel $objPHPExc ...
  • 最近再學習Libevent由於自己使用的是windows系統,遺憾的是有關在vs下可以參考的程式少之又少。在參考了許多的博客文章後。自己摸索寫了一個簡單的Libevent Server程式。並且在網上找了一個簡單的客戶端程式,測試該代碼成功。今天在此做一個記錄。 Libevent的確是一個非常好用的 ...
  • 本節介紹TreeMap,相比HashMap,它有什麼不同?除了Map介面,它還實現的SortedMap和NavigableMap介面有哪些方法?TreeMap具體是如何實現的?... ...
  • String str = "str"; str.length(); //3 返回字元串長度 str.indexOf("s"); //0 返回s所在下標0開始; 沒有則返回-1 str.trim(); //"str" 去除str的前後空格 str.substring(0,1); //"s" 含首不含尾 ...
  • 加 ^$ 整個字元串滿足要求 不加部分字元串滿足要求即可通過 \:轉義字元 \d:任意一個數字 (digit:數字) \w:任意一個單詞字元( 數字,字母,下劃線)(word:單詞) \s:任意一個空白字元(\t \r \n \f \x0B) (space:空) \D:任意一個非數字字元 \W:任意 ...
  • 1.查看id生成策略,2.查看是否是手動設置的id ;3.查看實體對象映射配置是否正確. 例如: public Emplopes(String name, char gender) { super(name, gender); // TODO Auto-generated constructor s ...
  • 一、滑鼠控制角色行走(每一步固定距離) 1.首先,要理解角色移動的原理。 2.現在來定義所需變數,在main窗體模塊中最頂端輸入以下代碼。 3.在main窗體中繪製一個timer時間控制項,將其Enabled(啟動)設為false,Interval(間隔)設為30(這個可以自定義,是用來調整角色移動速 ...
  • 1.領域驅動簡介 領域驅動本身是一款古老的軟體建模思想 領域驅動兩大特性:通用語言.限界上下文 1.通用語言是一種思想.解釋是:團隊共用的術語.便於交流.//比如行業的術語或者.一個圈子內通俗的名稱如開發者們對Visual Studio 的簡稱:VS. 2.限界上下文是整個應用程式之內一種概念性邊界 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...