我正在使用IUnityContainer
注册稍后解析的类型。
我已经注册了以下类型:
// Register a "named type" mapping
container.RegisterType<IProcessHelper, FirstResponseHelper>("FirstResponseHelper");
container.RegisterType<IProcessHelper, SecondResponseHelper>("SecondResponseHelper");
因此,我可以在我的构造函数中使用如下所示:
public Finish(
IUnitOfWork unitOfWork ,
ILog logger,
..........
[Dependency("FirstResponseHelper")] IProcessHelper firstResponseHelpe,
[Dependency("SecondResponseHelper")] IProcessHelper secondResponseHelper
)
{
.........
_firstResponseHelpe = firstResponseHelper;
_secondResponseHelper = secondResponseHelper;
}
...并希望使用Substitute来解决它,就像“下面”一样。但通过传递“名字”=&gt;替代中不允许使用“FirstResponseHelper”! :(
// Trying to resolve in UnitTest, looks like below (passing name)
IProcessHelper firstResponseHelper = Substitute.For<IProcessHelper>("FirstResponseHelper")
IProcessHelper secondResponseHelper = Substitute.For<IProcessHelper>("SecondResponseHelper")
我需要调用FirstResponseHelper&amp;的方法。 SecondResponseHelper,来自我的UnitTest(MSTest)。
因此,我需要使用Substitute.For<>
为“命名类型”接口解决它。
答案 0 :(得分:1)
我假设您要将替补注册为命名注册,以便您可以解析Finish
。如果是这种情况,那么您可以使用InjectionFactory
返回替代品:
container.RegisterType<IProcessHelper>("FirstResponseHelper",
new InjectionConstructor(c => Substitute.For<IProcessHelper>()));
container.RegisterType<IProcessHelper>("SecondResponseHelper",
new InjectionConstructor(c => Substitute.For<IProcessHelper>()));
顺便说一句,我不会使用[DependencyAttribute]
而是删除这些属性并定义传递正确依赖关系的InjectionConstructor
:
container.RegisterType<Finish>(
new InjectionConstructor(
new ResolvedParameter<IUnitOfWork>(),
new ResolvedParameter<ILog>(),
new ResolvedParameter<IProcessHelper>("FirstResponseHelper"),
new ResolvedParameter<IProcessHelper>("SecondResponseHelper")));
或执行类似操作的InjectionFactory
:
container.RegisterType<Finish>(
new InjectionFactory(c =>
{
return new Finish(c.Resolve<IUnitOfWork>(),
c.Resolve<ILog>(),
c.Resolve<IProcessHelper>("FirstResponseHelper"),
c.Resolve<IProcessHelper>("SecondResponseHelper")
}));