将参数传递给IServiceLocator

4

我有一个ViewModel类,我想通过Unity ServiceLocator解析它,但是我的viewModel需要一个参数传递到构造函数中。该参数的类型是我的应用程序中的实体之一(一个客户对象),而不是某个服务实现。我知道可以使用Unity容器本身进行编码,像这样传递参数:

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

但是如果我没有直接访问所需容器的权限,我需要通过ServiceLocator进行访问,如下所示:

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

然而,使用第二种方法时,我没有办法将任何参数传递给ServiceLocator。是否有办法做到这一点?从ServiceLocator获取Container的实例,然后使用它是否“错误”?

2个回答

4
问题在于你正在尝试将实体(在本例中是Customer)注入到一个类中。实体是短暂的对象,通常不适合被注入。
相反,应该注入一个ICustomerRepository服务。您可以在应用程序的启动路径中注册ICustomerRepository实现,这样就不必直接调用容器,从而使应用程序设计更加清晰,单元测试更加容易。

我明白你的意思,Steven。但在我的情况下,客户实体作为itemsControl(主控件)的选定项出现,我想将其传递给我的详细viewModel。在某个地方,我需要将实体提供给详细viewModel - 也许只是在详细viewModel上使用一个客户属性就可以了,但最好是将其放入构造函数中... - Dav Evans
2
当您完全使用依赖注入时,根本无法通过构造函数获取Customer对象,因为详细视图模型将在主视图模型的构造函数中注入。在代码运行时,详细视图模型已经被创建。以这种方式做将确保最佳的可测试性。在构造函数中,您只想注入依赖项。在这种情况下,您的客户不是依赖项,而只是状态信息。您应该将其设置为属性或作为方法参数提供。 - Steven

0
如果您为ServiceLocator编写一个包装器(wrapper),则可以在包装器(wrapper)中保存Unity容器,并公开一个额外的resolve方法重载,该重载接受ParameterOverrides属性。然后,该方法可以使用Unity容器来执行解析,而不是使用ServiceLocator代码片段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接