2015-02-23 40 views
0

我正在使用Galasoft MVVM Toolkit和ServiceLocator來管理我的應用程序中的服務。 我想管理兩種不同的服務實現。應該在調試/設計模式下注入存根實現,並在其他情況下注入實際的實現。 僞代碼可能是:MVVM Light Toolkit(galasoft)注入存根

public TmepServiceLocator(){ 
    ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

    //If DEBUG/DESIGN MODE 
    //SimpleIoc.Default.Register<IMyService>(() => new MyServiceStub()); 
    //ELSE 
    SimpleIoc.Default.Register<IMyService>(() => new MyServiceImpl()); 
} 
public IMyService MyService{ 
    get{return ServiceLocator.Current.GetInstance<IMyService>();} 
} 

我該怎麼做?
在開發(而不使用Spring)時是否有解決方法來處理服務存根?

+0

你想使用比生產一個不同的實現調試?當生產中出現問題時,你是否希望發瘋?你爲什麼這樣對自己做? – thomasb 2015-02-23 16:36:56

+0

因爲真正的服務將使用數據庫來存儲/查詢數據,我希望能夠使用不需要連接到數據庫的存根進行調試。在這個存根中,數據存儲在一個List中。如果真正的服務仍在開發中(由團隊中的其他人員開發),它允許您開發應用程序的其他組件,而無需等待服務的全面實施。我通常在Spring中像這樣工作。所以,也許Spring是唯一的解決方案... – ltu 2015-02-23 16:59:58

+1

好吧,那麼你不能使用常規的依賴注入框架(你可以使用像SimpleInjector或LightInject這樣的輕量級框架),並且只需在獲取最終DB模塊時替換引導程序? – thomasb 2015-02-23 20:41:17

回答

0

在MVVM Light中,通常使用ViewModelLocator類型的對象進行依賴注入。

您可以使用靜態方法ViewModelBase.IsInDesignModeStatic。

if (ViewModelBase.IsInDesignModeStatic) 
{ 
    SimpleIoc.Default.Register<IMyService, StubServiceImplementation>(); 
} 
else 
{ 
SimpleIoc.Default.Register<IMyService, RealServiceImplementation>(); 
} 

除此之外,你可以使用條件

#if DEBUG 
SimpleIoc.Default.Register<IMyService, StubServiceImplementation>(); 
#else 
SimpleIoc.Default.Register<IMyService, RealServiceImplementation>(); 
#endif 
+0

您使用ViewModelLocator來管理和注入ViewModel,但使用ServiceLocator來管理和注入服務。是DEBUG變量的VisualStudio – ltu 2015-02-23 17:02:01

+0

你當然可以把服務注入任何你想要的。請參閱 來自MVVM Light的作者https://msdn.microsoft.com/en-us/magazine/jj991965.aspx 。 引用'在一些MVVM應用程序(尤其是基於MVVM Light工具包的應用程序)中,使用名爲ViewModelLocator的類來創建和公開某些應用程序的ViewModel。這是一個方便的位置,可以在標準mvvm輕應用程序中註冊大部分服務和服務消費者的 ,定位器作爲靜態資源添加,因此生病時總是會留下注入。 DEBUG是一個常量,定義您自己的: #define useDesign – matthes 2015-02-23 17:34:52