2013年9月12日 星期四

使用 Unity.MVC4 (Enterprsie Library Unity 2.1) 的進階註冊類別方式

之前曾經有位大家說過使用 Unity bootstrapper for ASP.NET MVC 的進階註冊類別方式:
Unity bootstrapper for ASP.NET MVC 進階註冊類別方式

但因為是使用 Unity 3 的關係才能夠使用那樣的方式,而且還必須是建置在 .NET Framework 4.5 的 ASP.NET MVC 專案才能夠使用,而使用非官方的 Unity + ASP.NET MVC 整合套件「Unity.MVC4」就沒辦法啦!

這一篇將會為各位說明如何在使用 Unity 2.1 的情況下也能做到自動註冊類別的方法。

 


網路上有介紹很多種方式可以讓我們不必在使用 Unity 2.1 時只能一個一個註冊類別,但這些方式都會牽涉到比較進階的操作,所以往往是有一定基礎的開發人員才會使用這些方式,或是直接參考別人的做法,例如以下的作法,是參考自「Unity Convention Based Registration  - Watson Jon」這篇文章裡的做法。

先建立 Assembly 的擴充方法,用來取得指定組件裡的 Interface 與有實作指定 Interface 的 Implement Type,

image

然後在原本註冊 Service 類別的地方使用上面的擴充方法來取代原本一個一個註冊類別的處理,

image

 

不過想要在使用 Unity.MVC4 (Unity 2.1) 的情況下有自動註冊註冊類別的功能,也可以使用其他的方式也能夠達成,記載剛才參考的文章裡,底下的 Comments 有一位「Artem Govorov」做了以下的回應,

image

在回應裡提到了他有做出了一個解決方案,可以做到自動註冊類別的處理,這套件叫做「Unity Auto Registration」,其實這就是這篇文章所要說明的重點。

 

Auto Registration

http://autoregistration.codeplex.com/

image

在首頁的那一段範例程式碼,就已經告訴我們 Unity Auto Registration 可以做到什麼,

image

 

回過頭來看看原本我們的程式內容:

image

首先要修改的是 Repository 的註冊,不過 Unity 2.1 原本就有對 Generic Type 有提供支援,所以這邊可以不必使用 Unity Auto Registration 來做處理,

MSDN - Unity 2.1 Registering Generic Parameters and Types

修改為以下的方式,

image

 

接下來是要修改 Service 的部份,此時就要搬出 NuGet,透過 NuGet 將 Unity Auto Registration 安裝到專案裡,

image

這裡要再一次申明,如果你的專案是使用「Unity bootstrapper for ASP.NET MVC」,那麼 Unity 3 已經有提供方法可以做自動註冊類別的處理,而如果你的專案是使用「Unity.MVC3 or Unity.MVC4」因為 Unity 2.1 並無提供自動註冊的方法,所以才需要使用到「Unity Auto Registration」,

image

原本註冊 Service 的方式,

image

改使用 Unity Auto Registration 的方式,

image

有人看到修改後的程式碼多了好幾行會有所質疑,原本兩行程式就可以解決,卻要改用這麼多行程式碼來處理呢?

專案裡的 Service 類別只有兩三個的話,是不用 Unity Auto Registration 來做處理,但如果專案裡的 Service 有十個、二十個、上百個呢?

使用 Unity Auto Registration 就可以幫我們處理掉必須手動加入註冊類別的動作,尤其是專案裡的 Service 有多個的情況下,這樣的處理還可以減少遺漏註冊的錯誤發生。

 

重新政裡一下 Bootstrapper.RegisterTypes() Method 方法的內容,修改為串接的方式處理,

image

上面的程式碼看起來就相當清楚,在註冊 IDbContextFactory 與 IRepository 的地方還是使用原本 Unity 的方式,而註冊 Service 類別的部分則是採用 Unity Auto Registration 的方式,兩種作法一樣可以使用串接的方式。

如果有人堅持用了 Unity Auto Registration 後,所有的註冊都應該用同一種方式來操作,以避免個人混亂的話,有是可以的,我就直接把上面的註冊內容改為全部使用 Unity Auto Registration 的方式,如下:

image

我是覺得這樣的作法並沒有比較好,反而將原本註冊 IDbContextFactory 與 IRepository 的部份給複雜了些,所以我還是會建議使用上一種作法,只有需要自動註冊的部份使用 Unity Auto Registration 。

 

以上

沒有留言:

張貼留言

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。