IOC框架Ninject實踐總結

2021-09-22 06:17:42 字數 2424 閱讀 3341

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/index
b、屬性注入

定義屬性,加上inject特性即可實現注入。

[inject]

public iuserservice currentuserservice

c、module注入

定義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中,這樣乙個容器我們稱之為...