Asp.net 面向介面可擴展框架之“Mvc擴展框架及DI”

来源:http://www.cnblogs.com/xiangji/archive/2016/05/06/5465171.html
-Advertisement-
Play Games

標題“Mvc擴展框架及DI”有點繞口,我也想不出好的命名,因為這個內容很雜,涉及多個模塊,但在日常開發又密不可分 首先說Mvc擴展框架,該Mvc擴展就是把以前的那個Mvc分區擴展框架遷移過來,並優化整合了一下 一、Mvc擴展框架主要功能: 1、Mvc的依賴註入(DI)功能(類MvcDependenc ...


標題“Mvc擴展框架及DI”有點繞口,我也想不出好的命名,因為這個內容很雜,涉及多個模塊,但在日常開發又密不可分

首先說Mvc擴展框架,該Mvc擴展就是把以前的那個Mvc分區擴展框架遷移過來,並優化整合了一下

一、Mvc擴展框架主要功能:

1、Mvc的依賴註入(DI)功能(類MvcDependency)

  依賴IContainerFactory介面,不再依賴具體容器

2、Mvc全局過濾器(GlobalFilterProvider)

  配置在Mvc的依賴註入容器中就能自動被Mvc調用。其實邏輯很簡單,就是繼承IFilterProvider介面,對外暴露Filters屬性,需要增加過濾器就配置到Filters屬性中

3、分模塊(Area分區)開發支持

  Area基類及相關支持類(AreaRoute、AreaListService)

4、分區過濾器(AreaGlobalFilterProvider)

5、分區註冊的HttpModule(AreaMergeModule)

  使用該HttpModule初始化分區及分區的依賴註入容器配置

二、依賴註入(DI)也挺複雜的

1、Mvc的依賴註入(DI)支持

  Mvc使用IDependencyResolver介面定義依賴註入,實現該介面並覆蓋Mvc預設的DI配置,主要是把Mvc的依賴註入適配到容器來支持,以便使用容器來做

2、容器的依賴註入(DI)

  成熟容器支持依賴註入功能,為用戶構造對象,並按當前對象(類)的依賴註入配置遞歸進行依賴註入操作

3、框架的依賴註入(DI)擴展(Fang.DI)

     其一、本框架不依賴任一成熟容器,所以為了便於更好的使用DI技術,所以擴展了DI支持,以便使用任意容器功能都可以使用DI

     其二、每種成熟容器的DI配置(標註)的方式不一致,導致使用特定容器的DI寫的代碼給使用其他容器技術的團隊復用性不好

     其三、本框架支持“快速檢索黑科技”(參考核心容器那篇),使用該依賴註入(DI)擴展可以使用“快速檢索黑科技“語法定義依賴註入標記

本篇內容涉及”Mvc擴展框架“子模塊,”依賴註入(DI)擴展“子模塊、主框架的核心容器及外部成熟容器(本篇繼續使用Unity容器做外部成熟容器示例)


介紹的差不多了,先上例子

一、Mvc的依賴註入(DI)

1、使用Unity容器做DI

1.1 配置初始化

首先註入Unity容器,初始化Mvc依賴配置(替代Mvc預設的DependencyResolver)

1.2 建一個測試頁面,使用Unity配置一個依賴註入服務

 

Ok,依賴註入成功

1.3 看一下Unity容器配置

2、使用Fluent代碼做依賴註入

木有問題,效果出來。使用容器技術不一定非要用配置文件,Fluent方式也是配置容器的選項之一。當然配置文件搭配Fluent也是木有問題。

以上例子雖然簡單,但用到了很多技術,有Mvc擴展框架、Unity容器及依賴註入(DI)擴展。

 

二、全局過濾器

1、過濾器代碼很簡單

以上只是ActionFilter的例子,Mvc支持的AuthorizationFilter\ExceptionFilter\ActionFilter\ResultFilter都可以這樣配置,是不是很爽啊

2、看一下容器配置信息

有人說,你能用Fluent代碼再作一次過濾器的例子嗎?當然可以,只要創建一個IFilterProvider對象,註入到容器裡面就可以了。沒必要再做這個重覆的工作。

我是非常推薦使用配置文件的方式,項目和調用的服務具體實現類才能徹底的隔離,才能更好的體現IOC容器的作用

 

三、分模塊(area分區)

1、分區路由配置

2、兩個分區配置

3、執行效果

以上兩個分區運行結果,且兩個分區調用的服務稍有不同,導致結果稍不同

分區的講解不展開了,參看原來的文章”分區擴展框架“,只是分區過濾器稍有不同,後面再講解分區過濾器

 

四、分區過濾器

1、還是使用全局過濾的代碼,直接看結果

以上其實是分區過濾器和全局過濾器整合測試,兩個分區共用一個全局過濾器GlobalTest,每個分區還有自己的分區過濾,效果不錯吧

2、看一下過濾器配置(配置和全局過濾器是不同的)

看以上配置,分區過濾器和全局過濾器配置幾乎一致(實際上也是繼承關係),而且從分區中拆分出來,效果和原來(參看原來文章”分區擴展框架“)一樣,結構是不清晰多了,而且也減輕了area初始化的負擔,算是優化吧。

3、AreaMergeModule(分區註冊的HttpModule)配置

配置方法還是那麼簡單,這方面的內容還是參看前篇文章

 

五、框架的依賴註入(DI)擴展(Fang.DI)

1、配置方式

和Unity的屬性依賴註入相似度很高吧,只是命名空間不一樣,但是作用大很多,還可以對不支持DI的容器進行DI(依賴註入)

2、執行效果

效果和Unity容器配置的一樣。使用DI擴展對不同容器就可以統一依賴註入語法了。但是美中不足的是,我只在依賴註入擴展模塊(Fang.DI)中實現了屬性依賴註入。

我個人認為有屬性依賴註入就夠用了。當然很多人都有反駁的理由,最為關鍵的應該是安全性。如果我們把服務的初始化都交給容器,不要去修改服務對象,也就沒有安全一說;如果你非要修改,就算是private的,類內部也可以修改,外部使用反射也能修改,沒有絕對的安全性。

 

3、使用“快速檢索黑科技“語法定義依賴註入標記

上面標註中重點要看到有個點(.),本例就是把全局服務容器中的預設時間格式化服務DI到當前Controller的屬性上;也就是說可以把任意容器中的任意服務都DI過來,絕對的黑科技!!!

 

六、各功能模塊都是如何協同工作的

1、Mvc擴展框架、Unity容器及依賴註入(DI)擴展模塊相互獨立,相互沒有依賴關係

上圖可以清晰看到,他們相互獨立,但是他們都依賴著面向介面主框架(Fang.Framework),那主框架就非常重要,各自和主框架的關係就非常重要

(這就是我設計這個框架的初衷,以後增加再多的功能,或者引入再多的第三方組件,都只依賴主框架,都是對作為主框架的服務(插件)或者Mvc等Ms框架的插件來調用運行)

2、以上例子中各模塊式如何工作

先看項目配置

以上先註冊Unity容器,再註冊依賴註入擴展(Fang.DI),分區及其路由規則使用HttpModule註入

我們還看到一個有意思的東西,註入DI居然和註入容器那麼的相似,其實DI擴展就是容器封裝,說白了就是容器擴展,也就是說我是通過擴展容器來實現DI的

3、那我們看看依賴註入擴展(Fang.DI)怎麼工作的

3.1 依賴註入擴展(Fang.DI)項目截圖

A:DependencyAttribute就是依賴註入標註(Attribute),靠他說明哪個屬性需要註入

B:Container和ContainerFactory詩容器封裝,封裝後的容器對象就有了擴展出來的DI功能,所以我們調用的原始容器即使沒有依賴註入功能經過這麼一封裝就有依賴註入功能了

C:PropertyChecker類就是負責找到那些屬性需要依賴註入,PropertyChecker實例對象封裝了一個屬性的依賴註入過程(功能)

D:CheckContainer定義了一個使用容器處理依賴註入的介面(ICheckContainer)及多個Checkers屬性包含多個ICheckContainer對象,並自己實現ICheckContainer介面

(其實就是容器處理依賴註入的組合模式,其中前面的PropertyChecker就是實現的ICheckContainer介面,一般來說CheckContainer對象包含一個PropertyChecker的數組)

註:這塊剛開發完,CheckContainer這個命名有點問題,以後再改,如果有建議好的命名可以回覆我一下,謝謝

3.2 再來看一下CheckContainer的主要邏輯(還是比較簡單的)

解讀一下:

A:字典(ConcurrentDictionary)按類型緩存對象

B:MonitorWrapper是我寫的一個對象鎖的封裝,避免死鎖和控制鎖定的最長時間(預設50毫秒)及返回是否鎖定成功;

(既然是緩存,那鎖只是幫我們提高緩存利用率的工具,所以不管是否鎖定成功,都繼續執行)

C:如果沒有緩存,我們按類型獲取可寫並標註(DependencyAttribute)的屬性,按屬性構造註入功能(ICheckContainer)對象

D:那裡的註入比較簡單,我直接使用的反射;

(打算以後使用Emit,但是我的Emit功底太差,Emit個功能要半天,以後在好好學習Emit技巧或者花時間好好調試,為了性能不能有半點馬虎)

 

本篇內容就講完了。本篇內容和原來的那篇”分區擴展框架“有很多相同的地方,但本質的東西區別很大。原來的分區框架是強依賴Unity容器的,本框架是使用配置到主框架的容器工廠。

很多配置也都有更多的自定義化,而且本框架也照顧到不使用分區的開發使用者的利益(全局過濾和MvcDependency(DI))。

還有就是依賴註入擴展模塊(Fang.DI)和Mvc擴展框架無縫結合,真是如虎添翼。當然,Fang.DI在非Mvc中的也是一樣有效,這裡就不舉例說明瞭。


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

-Advertisement-
Play Games
更多相關文章
  • A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ num[i+1], find a peak element and return its inde ...
  • 如果有介面,寫在介面方法上即可。滑鼠滑過方法名時時會顯示 如果沒有介面,寫在每個方法上方。 eclipse 分三步 ① 找到方法,並將游標移動至方法名的上方 ②/** ③回車 那,效果是醬紫 ...
  • 本來用之前也過的堆直接實現比較好,這裡我直接重新寫一了函數融入進去了 註釋部分的代碼,是用來進行哈夫曼編碼的,這種編碼方式就不需要使用三叉鏈的樹了(帶有parent指針的三叉樹) ...
  • 05年第一次接觸要做彩票項目的客戶,見面談了下,客戶給了一些各彩種各玩法的獎金文檔,並給了一個正在運營的彩票網站,客戶要求我們對照功能上評估工作量然後報價。 半個月後再次見面,通過評估後報價7W(當時客戶只要求做,重慶、天津、江西以及廣東、江西、山東11選、福彩3D、上海時時樂、北京快樂8)。敲定價 ...
  • 好書不能只讀一遍,這兩天又翻看了一遍《你必須知道的.NET》,重溫了下基礎,重溫了下經典,簡單記錄了下來。 記憶體分配:CLR 管理記憶體的區域,主要有三塊,分別為: 線程的堆棧,用於分配值類型實例。堆棧主要由操作系統管理,而不受垃圾收集器的控制,當值類型實例所在方法結束時,其存儲單位自動釋放。棧的執行 ...
  • 剛開始接觸.NET很疑惑,看完視頻也不是太懂,通過總結和反覆,從概括和概念入手,慢慢變得清晰了。這篇博客主要是我對.NET基礎知識的瞭解,算作積累吧。 .NET框架體繫結構 由四個主要部分組成 公共語言運行時(CLR)是.NET框架應用程式的執行引擎..NET框架的關鍵作用在於,它提供了一個跨編程語 ...
  • 詳細步驟 創建文件夾,規劃好項目目錄 創建相關實體類 (Data Model) 創建 Database Context 創建Initializer, 使用EF初始化資料庫,插入測試數據 實現資料庫登錄驗證 總結 一,創建文件夾,規劃好項目目錄 1.根目錄下新建一個 ViewModels文件夾: Mo ...
  • Updated 22/Apr/2016: The NuGet package is now being uploaded daily. The payload doesn’t change every day but you should see new bug fixes and/or featu ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...