2015-02-23 70 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