2017-08-06 49 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") 
    })); 
相關問題