Lind.DDD.IoC(大叔推薦)~在服務定位器中引入IoC容器~容器的適配器

来源:http://www.cnblogs.com/lori/archive/2016/07/12/5663045.html
-Advertisement-
Play Games

回到目錄 關於依賴倒置(DIP) 高層模塊不依賴於低層模塊的實現,而低層模塊依賴於高層模塊定義的介面,通俗的講,就是高層模塊定義介面,低層模塊負責實現,這在我們實際開發中經常被用到,層與層之間引用,經常被添加一個介面層去隔離,在介面層定義相關業務規範,而底層去實現它,高層只引用這個介面,當高級需要其 ...


回到目錄

關於依賴倒置(DIP)

高層模塊不依賴於低層模塊的實現,而低層模塊依賴於高層模塊定義的介面,通俗的講,就是高層模塊定義介面,低層模塊負責實現,這在我們實際開發中經常被用到,層與層之間引用,經常被添加一個介面層去隔離,在介面層定義相關業務規範,而底層去實現它,高層只引用這個介面,當高級需要其它擴展,直接添加新的介面,由新的底層模塊去實現即可,底層其它代碼不需要修改,這也完全複合開閉原則(OCP).

關於控制反轉(IOC)

控制反轉是一種設計模式,像單例,工廠,適合器都屬於設計模式的一種,它是依賴倒置原則的具體實現,它告訴我們應該如何做,來解除相互依賴模塊的耦合.

關於依賴註入(DI)

是IOC的一種實現方式,我們經常說的構造方法註入,屬性註入,介面註入,指的就是DI,而我們經過說的unity,autofac,castle指的是DI的框架,即我們的IOC容器!

關於Lind.DDD.IoC容器

對於Lind.DDD.IoC模塊來說,主要實現的功能是IoC和AoP,它在整個框架中都起到了底層支持的作用,如你的倉儲在生產時,需要用到IoC;你的業務模塊根據一個規則實現了多種策略,在生產這個業務模塊時,需要用到IoC容器,而這個IoC容器可以通過服務定位器很方便找到你的依賴關係,坦白的說,對於所有對象的生產,都離不開服務定位器.

關於服務定位器(ServiceLocator)

一個程式集依賴別一個程式集,我們的服務定位器將幫助我們在Bin目錄查找對應的依賴關係,幫我們生產對象;Lind.DDD里的服務定位器依賴了Lind的IocContainer,而新的IOC容器如果希望被服務定位器使用,我們只要實現IocContainer即可,這對於程式的擴展性是有好處的,目前Lind.IoC只集成了unity和autofac兩種IoC容器.

關於Lind框架的IContainer

對所有第三方IoC容器的抽象,它只實現了最一般的IoC方法,如註入,反轉,是否被註入等,具體看一下代碼

    /// <summary>
    /// IoC容器規範
    /// 作者:倉儲大叔
    /// </summary>
    public interface IContainer
    {
        /// <summary>
        /// 反射成對象
        /// </summary>
        /// <typeparam name="TService">介面類型</typeparam>
        /// <returns>具體類型</returns>
        TService Resolve<TService>();
        /// <summary>
        /// 反射成對象
        /// </summary>
        /// <typeparam name="TService">介面類型</typeparam>
        /// <returns>具體類型</returns>
        object Resolve(Type type);
        /// <summary>
        /// 反射成對象
        /// </summary>
        /// <typeparam name="TService">介面類型</typeparam>
        /// <param name="overridedArguments">參數</param>
        /// <returns>具體類型</returns>
        TService Resolve<TService>(object overridedArguments);
        /// <summary>
        /// 反射成對象
        /// </summary>
        /// <typeparam name="TService">介面類型</typeparam>
        /// <param name="overridedArguments">參數</param>
        /// <returns>具體類型</returns>
        object Resolve(Type serviceType, object overridedArguments);
        /// <summary>
        /// 註冊抽象類型與具體實現的類型
        /// </summary>
        /// <param name="from">介面類型</param>
        /// <param name="to">具體類型</param>
        void RegisterType(Type from, Type to);
        /// <summary>
        /// 類型是否被註冊到IoC容器
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        bool IsRegistered(Type type);
    }

關於適配器模式

對於多種IoC容器的統一,我們借用了適配器模式,新添加了適配器類去實現我們自己的IContainer介面,在實現時,事實上是對原來第三方容器的重寫,這種模式雖然添加了額外的類對象,但實現了對現有功能的擴展.

關於框架級的工廠模式

工廠模式一般不去實現,在業務層直接使用ioc容器生產對象即可,你使用工廠模塊,一般都會有對象的switch這種壞味道的塊出現,但對於比較穩定的框架對象來說,使用工廠模式還是比較不錯的選擇,因為你的框架實現是比較固定的,所以可以使用switch來進行策略的控制,從而生產指定的對象,當然對於不滿足條件的,我們也應該手動throw出來,告訴開發人員.

結束語

希望大家都去自己寫C#的框架,而不是每次都依賴從java共用出來的框架,感覺味道怪怪的,難道C#程度員真的這麼懶呀!

哈哈!

回到目錄


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

-Advertisement-
Play Games
更多相關文章
  • 描述 風景迷人的小城Y市,擁有n個美麗的景點。由於慕名而來的游客越來越多,Y市特意安排了一輛觀光公交車,為游客提供更便捷的交通服務。觀光公交車在第0分鐘出現在1號景點,隨後依次前往2、3、4……n號景點。從第i號景點開到第i+1號景點需要Di分鐘。任意時刻,公交車只能往前開,或在景點處等待。 設共有 ...
  • 1.打開pip的文檔官網 https://pip.pypa.io/en/stable/ ,進入installation。在installation里,我們需要的是get-pip.py這個腳本。 選中後下載,我把它另存到C盤。 2.打開cmd命令行,打開C盤根目錄並運行get-pip.py腳本。當然, ...
  • 游戲服務端架構 介紹 端游、手游服務端常用的架構是什麼樣的? http://www.zhihu.com/question/29779732 根據知乎問答文章整理而成。 作者:韋易笑 謝邀,手游頁游和端游的服務端本質上沒區別,區別的是游戲類型。 類型1:卡牌、跑酷等弱交互服務端 卡牌跑酷類因為交互弱,... ...
  • JNA 調用 dll 庫時,保錯: 我環境是 64 位 win7. java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 應用程式。 解決方法, 刪掉了系統中的 64 位的 JDK,就沒有再報該錯誤了。 ...
  • Java.util.zip 提供用於讀寫標準 ZIP 和 GZIP 文件格式的類。 還包括使用 DEFLATE 壓縮演算法(用於 ZIP 和 GZIP 文件格式)對數據進行壓縮和解壓縮的類。 依賴 Jdk 編寫該工具類,不依賴任何第三方 jar,隨用隨取,實現功能大體如下: 1.目錄級別遞歸壓縮與解壓 ...
  • c++ auto_ptr智能指針 該類型在頭文件memory中,在程式的開通通過 #include<memory> 導入,接下來講解該智能指針的作用和使用。 使用方法: auto_ptr<type> ptr(new type()); 這是該指針的定義形式,其中 type 是指針指向的類型,ptr 是 ...
  • 前文Selenium2入門(一)說到Selenium是Web 應用程式測試框架,那麼如果對一個簡單的web應用需求:打開瀏覽器,登錄百度首頁,輸入“歐洲杯”關鍵詞,點擊搜索按鈕 這一系列操作,能否用Selenium進行執行呢?可以,下麵介紹的WebDriver就是可以完成這項任務的方法之一: Web ...
  • 目錄: 1.StringBuffer和StringBuilder有什麼區別?假設有一個方法,方法內部需要定義一個對象,可能是StringBuffer或StringBuilder,接下來會多次append操作,方法結束時,返回這個對象的toString()結果,並且這個線程會被多線程併發訪問,請選擇這 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...