4

我有一个 ViewModel 类,我想通过统一 ServiceLocator 解决它,但我的 viewModel 需要构造函数的参数。参数的类型是我的应用程序中的实体之一(客户对象),而不是某些服务实现。我知道针对 Unitycontainer 本身的编码我可以传递这样的参数:

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

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

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

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

4

2 回答 2

4

问题是您试图将实体(Customer在这种情况下)注入到一个类中。实体是短暂的对象,它们往往不是被注入的好对象。

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

于 2011-03-15T11:09:20.017 回答
0

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

于 2011-05-18T02:28:53.237 回答