You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:52:06