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

从Autofac迁移至DryIoC:如何在解析时指定依赖实例?

DryIoC中Resolve时指定特定依赖的解决方案

DryIoC完全支持在Resolve阶段指定特定的依赖实例,比你目前用Func的临时方案要便捷得多,这里有几种完美匹配你需求的实现方式:

方案1:引用已注册的带Key的依赖

既然你已经通过Container.UseInstance(fake, serviceKey: key)将fake实例注册到容器中,那么在解析TestClassC时,只需要明确指定它的ITestInterface依赖使用这个Key对应的实例即可:

var result2 = Container.Resolve<TestClassC>(
    Parameters.Of.Type<ITestInterface>(serviceKey: key)
);

这个写法会告诉DryIoC:在构造TestClassC时,所有类型为ITestInterface的参数,都使用容器中注册时标记了指定Key的实例。完全符合你的测试预期,result2.Instance会和你的fake实例完全相等。

方案2:直接传入实例覆盖依赖

如果你不想提前把fake注册到容器里,还可以跳过注册步骤,直接在Resolve时传入实例来覆盖默认依赖:

方式A:使用Parameters直接传入实例

var fake = A.Fake<ITestInterface>();
// 无需提前注册fake
var result2 = Container.Resolve<TestClassC>(
    Parameters.Of.Type<ITestInterface>(fake)
);

方式B:使用overrideDependencies回调

这种写法更直观,适合需要覆盖多个依赖的场景:

var fake = A.Fake<ITestInterface>();
var result2 = Container.Resolve<TestClassC>(
    overrideDependencies: resolver => resolver.Replace<ITestInterface>(fake)
);

如果TestClassC有多个需要覆盖的依赖,只需要在回调里多次调用Replace即可,比如:

resolver.Replace<ITestInterface>(fake)
       .Replace<IOtherDependency>(otherFake)

对比临时方案的优势

这些原生API比你用Func的临时方案要灵活得多:

  • 无需为不同的依赖组合编写对应的扩展方法
  • 支持同时覆盖多个依赖
  • 代码更直观,符合DI容器的常规使用习惯

替换后你的测试代码可以正常通过:result1会使用容器中默认注册的TestClassB实例,result2会使用你指定的fake实例。

内容的提问来源于stack exchange,提问作者Wadim Smirnow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:32:58