将参数传递给IServiceLocator

时间:2011-03-15 10:58:52

标签: c# dependency-injection inversion-of-control unity-container service-locator

我有一个ViewModel类,我想通过unity ServiceLocator解析,但是我的viewModel需要一个构造函数的参数。参数的类型是我的应用程序中的一个实体(Customer对象),而不是某些服务实现。我知道对Unitycontainer本身进行编码我可以通过这样的参数:

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

但如果我没有直接访问容器,我需要通过ServiceLocator这样:

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

但是使用第二种方法我无法将任何参数传递给ServiceLocator。有什么办法可以做到吗?从ServiceLocator获取Container的实例然后使用它是“错误的”吗?

2 个答案:

答案 0 :(得分:4)

问题是你试图将一个实体(在这种情况下为Customer)注入一个类。实体是短命的物体,它们往往不适合被注射。

不是注入Customer,而是注入ICustomerRepository服务。您可以在应用程序的启动路径中注册ICustomerRepository实现,这样您就不必直接调用容器,这样可以使应用程序设计更清晰,单元测试更容易。

答案 1 :(得分:0)

如果为ServiceLocator编写一个包装器,则可以在包装器中保存unity容器,并公开另一个带有ParameterOverrides属性的resolve方法重载。然后,该方法可以使用统一容器根据您的第一个代码段而不是ServiceLocator代码片段来执行解析。