Как разрешить именованный тип в NSubstitute?

Я использую 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, что-то вроде «ниже». Но передача «имя» => «FirstResponseHelper» не допускается в Substitute! :(

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

Мне нужно вызвать метод из FirstResponseHelper и SecondResponseHelper из моего UnitTest (MSTest). Следовательно, мне нужно разрешить это, используя Substitute.For<> для интерфейса «именованного типа».


person R.L. Narayanan    schedule 06.08.2017    source источник
comment
Привет, @Lakshminarayanan, возможно, следует переименовать вопрос в «Как разрешить «именованный тип» в контейнере Unity?». Я не думаю, что это специфично для NSubstitute, а скорее для внедрения любого именованного экземпляра.   -  person David Tchepak    schedule 07.08.2017


Ответы (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")
    }));
person Randy supports Monica    schedule 07.08.2017