2017-08-06 26 views
0

我正在使用IUnityContainer来注册稍后解析的类型。 我已经注册的类型如下:因此如何解决NSubstitute中的“命名类型”?

// 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; 
    } 

...并希望得到它使用替代解决,像“下面”一样。但通过传递“名字”=>“FirstResponseHelper”不允许替换! :(

// Trying to resolve in UnitTest, looks like below (passing name) 
IProcessHelper firstResponseHelper = Substitute.For<IProcessHelper>("FirstResponseHelper") 
IProcessHelper secondResponseHelper = Substitute.For<IProcessHelper>("SecondResponseHelper") 

我需要从FirstResponseHelper &调用一个方法SecondResponseHelper,从我的单元测试(MSTest的)。 因此,我需要得到它使用Substitute.For<>的 “命名型” 接口解决。

+0

喜@Lakshminarayanan,也许考虑将问题重命名为“如何解析”命名类型“在Unity容器中?”。我认为这不是特定于NSubstitute,而是为了注入任何命名实例。 –

回答

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") 
    })); 
相关问题