2017-08-06 3 views
0

J'utilise IUnityContainer pour enregistrer les types à résoudre ultérieurement. J'ai enregistré les types comme ci-dessous:Comment résoudre "type nommé" dans NSubstitute?

// Register a "named type" mapping 
container.RegisterType<IProcessHelper, FirstResponseHelper>("FirstResponseHelper"); 
container.RegisterType<IProcessHelper, SecondResponseHelper>("SecondResponseHelper"); 

Par conséquent, je ne pouvais en mesure d'utiliser comme ci-dessous dans l'un de mon constructeur:

 public Finish(
     IUnitOfWork unitOfWork , 
     ILog logger, 
     .......... 
     [Dependency("FirstResponseHelper")] IProcessHelper firstResponseHelpe, 
     [Dependency("SecondResponseHelper")] IProcessHelper secondResponseHelper 
    ) 
    { 
     ......... 
     _firstResponseHelpe = firstResponseHelper; 
     _secondResponseHelper = secondResponseHelper; 
    } 

... et voudrait l'obtenir résolu à l'aide de remplacement , quelque chose comme "ci-dessous". Mais en passant le "nom" => "FirstResponseHelper" n'est pas autorisé dans Substitute! :(

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

Je dois appeler une méthode de FirstResponseHelper & SecondResponseHelper, de mon UnitTest (MSTest). Par conséquent, je dois l'obtenir résolu en utilisant Substitute.For<> pour l'interface "de type nommé".

+0

Salut @Lakshminarayanan, peut-être envisager de renommer la question à "Comment résoudre" le type nommé "dans le conteneur Unity?". Je ne pense pas que cela soit spécifique à NSubstitute, mais plutôt pour injecter n'importe quelle instance nommée. –

Répondre

1

Je suppose que vous voulez enregistrer un nom de remplacement que l'enregistrement afin que vous puissiez résoudre Finish Si tel est le cas, vous pouvez utiliser un InjectionFactory pour retourner le substitut.

container.RegisterType<IProcessHelper>("FirstResponseHelper", 
    new InjectionConstructor(c => Substitute.For<IProcessHelper>())); 

container.RegisterType<IProcessHelper>("SecondResponseHelper", 
    new InjectionConstructor(c => Substitute.For<IProcessHelper>())); 

En aparté je ne voudrais pas utiliser le [DependencyAttribute] et au lieu de supprimer ces attributs et définir une InjectionConstructor qui passe dans les dépendances correctes:

container.RegisterType<Finish>(
    new InjectionConstructor(
     new ResolvedParameter<IUnitOfWork>(), 
     new ResolvedParameter<ILog>(), 
     new ResolvedParameter<IProcessHelper>("FirstResponseHelper"), 
     new ResolvedParameter<IProcessHelper>("SecondResponseHelper"))); 

ou un InjectionFactory qui fait quelque chose de similaire:

container.RegisterType<Finish>(
    new InjectionFactory(c => 
    { 
     return new Finish(c.Resolve<IUnitOfWork>(), 
      c.Resolve<ILog>(), 
      c.Resolve<IProcessHelper>("FirstResponseHelper"), 
      c.Resolve<IProcessHelper>("SecondResponseHelper") 
    }));