2014-02-18 3 views
0

Есть ли способ получить экземпляр класса из инжектора зависимости?Мгновентировать зависимую инъекцию класса

Например, зарегистрировать свои типы, а затем есть класс вроде этого:

public class A { 
    private readonly Iinterface _object; 

    public A (Iinterface object) { 
     _object = object; 
    } 

    //do stuff using _object 
} 

public class B { 
    public void DoSomething() { 
     var instanceOfA = DIContainer.GetInstance(typeof(A)); 
     //do stuff with instanceOfA which has been constructed using DI 
    } 
} 

В настоящее время, я бы зарегистрировать класс А, который будет введен, а затем, что вводили в класс Bs конструктор. Мне просто любопытно, есть ли способ получить экземпляр A, созданный для меня из Unity, с автоматически введенными значениями, поэтому мне не нужно регистрировать его или проходить через объекты.

Пожалуйста, имейте в виду, что это не фактический случай использования, который я рассматриваю, но я хочу узнать больше о моих вариантах с инъекцией зависимостей и Единством.

+1

В чем заключаются отношения между 'A' и' B'? Было бы возможно, чтобы «А» ввел зависимость в «В»? –

+0

Да, это то, что я бы делал в настоящее время, но им интересно, есть ли способ получить «А», не вводя его тоже. – tau

ответ

4

В Unity существует несколько способов получить зависимости.

  1. Constructor Injection
  2. Injection
  3. недвижимости
  4. вручную разрешить

Я считаю, что вы просите за это 3 #.

В вашем примере, вы можете получить класс А экземпляр (предоставившие вы уже зарегистрированы IInterface) по:

unityContainer.Resolve<A>(); 

упрощенно думать единство это действительно умный завод, который может дать вам объект в конструкторе, свойство или вызов метода. Попросите любой тип объекта или тип интерфейса, и он даст вам один. Предостережение - вам нужно дать ему понять, как справляться с двусмысленностями. Это в основном то, где регистрации вступают в игру.

В приведенном выше примере единственная двусмысленность - Iinterface, так что это единственный класс, который вам нужно будет зарегистрировать. Разрешение класса A или B не требует каких-либо регистраций, потому что это уже конкретный тип.

+0

спасибо, что посмотрели. мой опыт работы с DI побудил меня поверить в основном то, что вы написали, но я ценю, насколько вы объяснили это и подтвердили многое из того, что я считаю. – tau

1

Это зависит от соотношения между A и B:

Если B зависит от A, то это будет иметь смысл для A, чтобы ввести зависимость в B (или, возможно, придать A сам ).

Я бы не рекомендовал B «найти» зависимость, посмотрев на A. В лучшем случае у вас есть сильная зависимость между B и A, в худшем случае вы получаете анти-шаблон «Локатор сервисов».

Если у вас нет критической потребности поддерживать зависимость между A и B Я бы не стал их связывать с вами больше, чем вам нужно.

+0

Я согласен с вами, но им интересно, возможно ли, чтобы 'B' каким-то образом создавал экземпляр с зависимостями« A »без ввода« A »в его конструктор. – tau

+0

Возможно, это возможно (я недостаточно знаю об Unity, чтобы знать), но он все еще создает зависимость от A. Если там _should_ быть зависимостью от A, то инъекция либо A, либо зависимость действительна. –

Смежные вопросы