3

我有一個ViewModel類,我想通過統一ServiceLocator來解析,但我的viewModel需要一個參數給構造函數。該參數的類型是我的應用程序中的一個實體(一個Customer對象),而不是某個服務實現。我知道,編碼對Unitycontainer本身我可以通過這樣的paramater:傳遞參數到IServiceLocator

_container.Resolve<CustomerDetailViewModel>(new ParameterOverrides {{"customer", customer}}); 

,但如果我沒有到容器直接訪問我需要通過服務定位,以這樣的:

(CustomerDetailViewModel)ServiceLocator.Current.GetInstance<CustomerDetailViewModel>(); 

但是使用第二種方法,我無法將任何參數傳遞給ServiceLocator。有什麼辦法可以做到嗎?從ServiceLocator獲取容器的實例然後使用它是否「錯誤」?

回答

4

問題是,您正試圖將一個實體(在此例中爲Customer)注入類中。實體是短暫的對象,它們往往不適合被注入。

而不是注入Customer,注入ICustomerRepository服務。您可以在應用程序的啓動路徑中註冊一個ICustomerRepository實現,這樣您就不必直接調用容器,這使得應用程序設計更清晰,單元測試更容易。

+0

我聽到你在說什麼Steven,但在我的實例中,Customer實體是作爲itemsControl(主)的選定項目來的,我想將它傳給我detail viewModel。沿着這條線的某處,我需要爲實體提供詳細信息viewModel - 也許只是在細節viewModel上使用Customer屬性是一條路,但它可以很容易地進入構造函數.... – 2011-03-15 14:04:26

+2

當你一路使用依賴注入,完全無法通過構造函數獲取Customer對象,只是因爲viewModel細節將被注入到主構造函數中。在您的代碼運行時,詳細viewModel已經創建。這樣做將確保最佳的可測試性。在構造函數中,你只需要注入依賴關係。在這種情況下,您的客戶不是依賴關係,而只是狀態信息。您應該將其設置爲屬性或將其作爲方法參數提供。 – Steven 2011-03-15 14:11:55

0

如果您爲ServiceLocator編寫包裝器,則可以在包裝器中容納統一容器,並公開一個採用ParameterOverrides屬性的額外解析方法重載。然後,該方法可以使用統一容器根據您的第一個代碼片段而不是ServiceLocator代碼片段來執行解決方案。