WPF Prism.Unity:如何通过命名依赖注入构造ViewModel
解决Prism中命名依赖注入到ViewModel的问题
你的问题根源很明确:你给ICustomersService注册了两个命名实例("One"和"Two"),但ViewModel的构造函数请求的是无名称的默认实例,容器找不到对应的默认映射,所以抛出了解析异常。下面给你几种可行的解决方案:
方案1:用属性标记指定依赖名称(Unity容器适用)
如果你的Prism项目用的是默认的Unity容器,可以在构造函数的参数上添加[Dependency]特性,明确指定要注入的命名实例:
using Microsoft.Practices.Unity; // 需要引入这个命名空间 public CustomersViewModel([Dependency("One")] ICustomersService customersService, EventAggregator eventAggregator) { // 这里的customersService就是你注册的"One"对应的CustomersFakeService实例 }
把括号里的"One"换成"Two"就能注入另一个命名实例。
方案2:通过容器提供者手动解析(通用所有容器)
这种方式更灵活,也不依赖特定容器。你可以在ViewModel构造函数中注入IContainerProvider,然后手动解析指定名称的依赖:
public CustomersViewModel(IContainerProvider containerProvider, EventAggregator eventAggregator) { // 按需选择"One"或"Two" var customersService = containerProvider.Resolve<ICustomersService>("One"); // 后续使用这个实例即可 }
这种方法的好处是你可以在ViewModel里根据逻辑动态选择要使用哪个命名实例,而不是硬编码在构造阶段。
方案3:设置默认实例(适合需要默认映射的场景)
如果希望ViewModel构造函数直接请求ICustomersService时能拿到某个命名实例,可以在注册时额外添加一个默认映射:
// 先注册两个命名实例 containerRegistry.Register<ICustomersService, CustomersFakeService>("One"); containerRegistry.Register<ICustomersService, CustomersFakeService>("Two"); // 注册默认实例,指向"One"对应的实例 containerRegistry.Register<ICustomersService>(() => containerRegistry.Resolve<ICustomersService>("One"));
这样ViewModel的构造函数就不需要修改,直接注入ICustomersService就能拿到"One"的实例。
另外提个小细节:你的代码里注册的是CustomersFakeService,但服务实现里还有CustomersDBService,如果需要使用数据库版本的服务,记得注册时替换成对应的类型哦。
内容的提问来源于stack exchange,提问作者Alexey Titov
相关产品推荐
相关产品推荐

