выборочно разрешать зависимости одного и того же интерфейса в единстве - PullRequest
2 голосов
/ 24 февраля 2012

Мы используем инфраструктуру Unity для внедрения зависимостей. Я регистрирую две конкретные реализации для одного и того же класса. как ...

container.RegisterType<IInterface, MyFirstClass>("first");
container.RegisterType<IInterface, MySecondClass>("second");

В настоящее время существует несколько классов, в которых имеется инъекция для вышеупомянутого интерфейса.

 public class Class1
    {
       private IInterface _myClass
       public Class1 (IInterface myClass)
       {
         _myClass = myClass // // should be instance of MyFirstClass
       }
 //.. other code
    }

   public class Class2
    {
       private IInterface _myClass

       public Class2 (IInterface myClass)
       {
         _myClass = myClass // should be instance of MySecondClass
       }
 //.. other code
    }

Итак, теперь мы хотим разрешить IInterface выборочно в двух вышеупомянутых классах. Class1 и Class2.

Class1 должен вводиться с помощью MyFirstClass, а Class2 должен вводиться с помощью MyFirstClass. Этого можно достичь с помощью платформы Unity? Если нет, то какие другие платформы IoC поддерживают это?

Пожалуйста, предложите ваше мнение.

1 Ответ

3 голосов
/ 24 февраля 2012

Попробуйте это

var container = new UnityContainer();
container.RegisterType<IInterface, MyFirstClass>("first");
container.RegisterType<IInterface, MySecondClass>("second");
container.RegisterType<Class1>(new InjectionConstructor(new ResolvedParameter(typeof(IInterface), "first")));
container.RegisterType<Class2>(new InjectionConstructor(new ResolvedParameter(typeof(IInterface), "second")));
var class1 = container.Resolve<Class1>();
Assert.IsInstanceOfType(class1.MyClass, typeof(MyFirstClass));
var class2 = container.Resolve<Class2>();
Assert.IsInstanceOfType(class2.MyClass, typeof(MySecondClass));

public class MyFirstClass : IInterface
{
}

public class MySecondClass : IInterface
{
}

public interface IInterface
{
}

public class Class1
{
  public IInterface MyClass { get; set; }
  public Class1(IInterface myClass)
  {
    MyClass = myClass;
  }
}
public class Class2
{
  public IInterface MyClass { get; set; }
  public Class2(IInterface myClass)
  {
    MyClass = myClass;
  }
}
...