ninject是乙個輕量級的基於.net平台的依賴注入(ioc)框架。所謂的ioc,即控制反轉(inversion of control),它是乙個經典的物件導向程式設計法則,它的作用主要是用來幫助應用程式解耦,並把程式分離成乙個個松耦合高內聚的模組。控制反轉還有乙個名字叫依賴注入(dependency injection),簡稱di。
servicemodule
injectmanual注:ninject的繫結物件作用域有多種,本文的demo中有具體的單元測試,具體可以直接檢視原始碼或者參考官方文件。。
通過ninject的xml擴充套件,可以實現傳統的類似於spring.net、unity等ioc容器的注入方式。
<?xml version="1.0" encoding="utf-8" ?><
module
name="servicemodule"
>
<
bind
name="txtlog"
service="logservice.ilogservice,logservice"
to="logservice.impl.txtlogservice,logservice"
/>
<
bind
name="sword"
/>
<
bind
name="footsoldier"
/>
module
>
xmlservicemodule
injectbyconfig雖然配置注入看上去更容易擴充套件應對外部變化,但是專案龐大臃腫之後,配置檔案並不好管理。固然有一些視覺化的工具,但是仍然容易出現偏差。ninject最擅長的基本注入功能就是無配置簡單快速注入,達到free yourself from xml的目的,對於一般的中小型應用程式完全可以零配置。
通過ninject的mvc擴充套件可以輕鬆實現mvc專案的依賴注入。
(1)、controller實現注入
a、建構函式注入
account/indexb、屬性注入
定義屬性,加上inject特性即可實現注入。
[inject]c、module注入public iuserservice currentuserservice
定義module:
mvcservicemodule接著呼叫即可:
mvcservicemodule(2)、自定義attribute實現注入
exceptionhandleattribute和controller非常相似,示例使用屬性加上inject特性的方式實現注入,其他注入方式略過。
到這裡,你應該已經可以看到,這可以算是web應用程式中非常乾淨利落的注入方式,簡單的令人髮指。
通過ioc框架實現服務依賴注入本來不難,但是這裡或多或少會牽扯到乙個問題:注入服務呼叫是使用組合還是繼承?
舉例來說,最基礎的使用者服務(或者日誌服務),一般的web應用程式幾乎每個控制器(或者頁面)都或多或少和使用者有關係。
問題來了,不同的控制器或者頁面要呼叫使用者服務該怎麼做?
下面以mvc專案為例來說明一下通常的注入方法。
如你所知,通常的做法,所謂組合優於繼承(繼承被認為是一種強耦合),我們只要在需要呼叫服務的控制器中定義乙個服務變數或者屬性,通過建構函式注入,類似下面這樣:
controllerconstructor然後在對應的action中就可以呼叫使用者服務了。
如果你的controller很少,這種方式當然可以接受。但是,實際專案中控制器真的比較多的時候,有一些幾乎每個控制器必然用到的公共服務,我們是不是不得不哼哧哼哧寫很多建構函式實現依賴注入呢?
到這裡,你一定想到,是啊,都呼叫一樣的服務,幾乎都類似的**,重構吧!
最簡單的方式,利用繼承,集中在乙個地方(通常就叫basecontroller吧)寫一次,
basecontroller然後,在相應的controller下this點服務屬性名呼叫一下,多麼優雅乾淨簡潔。但是這種方式有一點需要特別需要注意,在controller的建構函式裡呼叫服務初始化一些資料可能不能讓你那麼隨心所欲,因為在建構函式內,服務還沒有初始化。
如上**所示,通過inject特性實現服務注入,通過繼承實現公共服務呼叫,不管哪種表現形式的應用程式都可以使用,有aop和繼承的世界看上去是多麼美好啊。當然了,具體使用哪種方式好每個人肯定都有自己的看法,實際專案中,我們通常選擇組合和繼承相結合的方式,這樣就可以兼顧兩者的優點實現注入。
最後還有幾個困擾人的問題需要思考:如何劃分服務?服務和服務之間是否應該依賴注入?如果僅僅是在表現層實現依賴注入,難道不覺得ioc的作用有點太醬油了嗎?
MVC三個IOC注入點之Ninject使用示例
群裡乙個技術大牛說mvc有三個注入點,但我只會乙個defaultcontrolle ctory。在群友的幫助下,我大致了解了下 icontrolle ctory idependencyresolver icontrolleractivator 這三者的關係如下 其實從上面的關係可以看出來這三個注入點...
MVC三個IOC注入點之Ninject使用示例
群裡乙個技術大牛說mvc有三個注入點,但我只會乙個defaultcontrolle ctory。在群友的幫助下,我大致了解了下 icontrolle ctory idependencyresolver icontrolleractivator 這三者的關係如下 其實從上面的關係可以看出來這三個注入點...
spring框架Ioc學習
理解 1 在ioc沒有出現之前,如果物件a需要依賴物件b,那麼在a初始化或執行到某乙個點的時候,需要去建立或者呼叫已經建立的物件b.不管是建立還是直接呼叫,控制權都在自己手裡.2 ioc出現之後,如果物件a需要依賴物件b,這是會有乙個容器來管理這種需求,將物件b注入到物件a中,這樣乙個容器我們稱之為...