我有一个ViewModel类,我想通过unity ServiceLocator解析,但是我的viewModel需要一个构造函数的参数。参数的类型是我的应用程序中的一个实体(Customer对象),而不是某些服务实现。我知道对Unitycontainer本身进行编码我可以通过这样的参数:
_container.Resolve<CustomerDetailViewModel>(new ParameterOverrides {{"customer", customer}});
但如果我没有直接访问容器,我需要通过ServiceLocator这样:
(CustomerDetailViewModel)ServiceLocator.Current.GetInstance<CustomerDetailViewModel>();
但是使用第二种方法我无法将任何参数传递给ServiceLocator。有什么办法可以做到吗?从ServiceLocator获取Container的实例然后使用它是“错误的”吗?
答案 0 :(得分:4)
问题是你试图将一个实体(在这种情况下为Customer
)注入一个类。实体是短命的物体,它们往往不适合被注射。
不是注入Customer
,而是注入ICustomerRepository
服务。您可以在应用程序的启动路径中注册ICustomerRepository
实现,这样您就不必直接调用容器,这样可以使应用程序设计更清晰,单元测试更容易。
答案 1 :(得分:0)
如果为ServiceLocator编写一个包装器,则可以在包装器中保存unity容器,并公开另一个带有ParameterOverrides属性的resolve方法重载。然后,该方法可以使用统一容器根据您的第一个代码段而不是ServiceLocator代码片段来执行解析。