2017-01-19 79 views
1

我已經分層的asp.net MVC應用程序。 在服務層,我有一個容器來註冊依賴關係。 e.g:統一 - 根據一些條件解決依賴關係

public static void RegisterTypes(IUnityContainer container) 
    { 
     container.RegisterType<ISomething, Something>(); 
    } 

根據設計,我們需要有一個mock實現 類的,如果用戶決定開放測試用的應用程序。

所以,我想出了一個主意就像

public static void RegisterTypes(IUnityContainer container) 
    { 
     container.RegisterType<ISomething, Something>(); 
     container.RegisterType<ISomething, SomethingMock>(); 
    } 

如果我使用標誌的地方,能夠顯示系統是否在測試模式下運行時,我怎麼能做出哪些依賴於解決決定運行? 如果它不是一個優雅的解決方案,可以選擇什麼?

回答

1

雖然我完全支持史蒂文斯的回答和他的考慮,但從技術上來說,有一種方法可以實現您的目標。 您可以使用一個名爲登記:

public static void RegisterTypes(IUnityContainer container) 
{ 
    container.RegisterType<ISomething, Something>(); 
    container.RegisterType<ISomething, SomethingMock>("SomethingMock"); 
} 

,然後用一個字符串參數來解決這個問題:

string s= ""; 
var mySomething = container.Resolve<ISomething>(s); // will return standard implementation 
s = "SomethingMock" 
var mySomething = container.Resolve<ISomething>(s); // will return mock implementation 

你需要的時候ASP要解決ISomething攔截。

更多信息參見 https://msdn.microsoft.com/en-us/library/ff660923%28v=pandp.20%29.aspx

現在它是由你走哪條路。

+0

我使用統一3.5,它似乎並沒有工作來解決命名註冊。 –

+0

我用Unity 4.0.1檢查過,它工作正常,但我認爲它應該也適用於舊版本。你的代碼會發生什麼?也許我們可以找出什麼是錯的。 – jps

3

如果我在某個地方使用標誌來指示系統是否在測試模式下運行,我如何決定在運行時解決哪個依賴關係?

根據運行時決策,您不應該更改對象圖的結構。這與anti-pattern of injecting runtime data into components非常相關。

在你需要基於運行時條件(意味着:該值可能從請求到請求改變)切換的實現的情況下,解決方案是創建一個實現ISomething幷包裝在兩個ISomething實現中,代理類(this article示出了一些示例的代理實現)。當調用ISomething.Method時,它可以根據它在此處確定的運行時條件將調用轉發給正確的實現。

然而,在您的情況下,您很可能不會討論運行時狀況,而是關於配置值。配置值在應用程序的生命週期中不會更改。只有在重新啓動(或重新部署)後,您通常纔會看到值的更改。

這意味着,你可以簡單地在啓動時讀取配置值,並在其實施應進行登記點決定:

if (bool.Parse(ConfigurationManager.AppSettings["Production"])) 
{ 
    container.RegisterType<ISomething, Something>(); 
} 
else 
{ 
    container.RegisterType<ISomething, SomethingMock>(); 
} 
+0

感謝您的回覆。我的情況是第一個。在每次請求時,我需要決定它的模擬請求還是真實請求。 關於代理類,請詳細解釋。我的服務層解決了業務依賴關係,每個業務都需要一些存儲庫類作爲數據層注入。現在我只需要嘲笑數據層。 –

+1

@AhmadMousavi:請使用其他信息更新您的問題,或在SO上發佈新問題,並提供所需的詳細信息以回答此附加問題。您可以在[本文](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=100)中閱讀更多關於如何實現此類代理的信息。 – Steven