从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
相关产品推荐
相关产品推荐

