2011-02-07 28 views
2

ASP.NET MVC(3.0)中使用Castle.Windsor有什麼辦法可以適當地處理,如果我的一個依賴關係解析爲空?例如,假設我有一個IMembershipServiceCastle.Windsor,ASP.NET MVC,處理注入的空分辨率

class ServiceInstaller 
{ 
// ... 
void Install(// ..) 
{ 
    container.Register(
    Component 
    .For<IMembershipService>() 
    .ImplementedBy<MembershipService>() 
    .LifeStyle.PerWebRequest 
); 
} 
} 

好的,這個工程很好。現在,也許不是我的所有站點都需要用戶登錄。假設我的虛擬主機的數據庫服務器可能會崩潰幾個小時。在這種情況下,查看數據庫或試圖調用我的ISession的內容可能會返回null。

我能在這種情況下做什麼?我可以寫if(membershipService == null)一百遍以上,但看起來很愚蠢。是否有內置的解決方案說「嘿,如果我們有錯誤,請執行此操作..?」

+0

如果您的數據庫服務器崩潰,您的數據庫查詢應該*拋出*,**永遠不會返回null。 – 2011-02-07 15:31:45

回答

4

我認爲該服務不應該爲空。如果數據庫關閉,應該返回服務,但是它的方法應該拋出一個異常,根據服務的語義返回null或者一些默認值。

+0

無論如何,需要有一種方法來處理它沒有找到它所尋找的情況。如果服務沒有正確返回,是否有任何方法可以設置默認行爲? – Ciel 2011-02-07 15:56:30

0

Ciel,i had this problem just recently,找到你的問題,同時尋找答案。

基本上你應該使用類型化的工廠來解決你的組件在運行時在你的包裝組件。如果沒有關於您正在尋找的組件的匹配,工廠應該返回一個默認對象,這個默認對象可以實現任何需要的行爲。

對於您的IMembershipService,請實現一個NotCheckingMembershipService類,該類繼承接口並且什麼都不做,並且使其不需要它的組件的默認值。更具體的會員服務可以鏈接到特定的控制器。

要做到這一點,你必須創建一個通用的「包羅萬象的」實施

public class NotCheckingMembershipService<T>: IMembershipService<T> where T: Controller 
{ 
} 

並將其註冊爲默認的組件進行開放IMembershipService

_container.Register(
      Component.For(typeof(IMembershipService<>)) 
      .ImplementedBy(typeof(NotCheckingMembershipService<>)) 
      .IsDefault()); 

然後只需註冊您的自定義會員服務需要的地方。分辨率不會失敗,您將始終可以調用界面。