2010-06-22 5 views
0

Я работаю над проектом, который использует MS Application Blocks. Я вижу, что dll «Единство» доступен для меня. Кстати, это версия 1.1. Как я могу использовать инъекцию зависимостей здесь?Могу ли я использовать Injection Dependency здесь?

У меня есть класс

public class ScheduleDataDetailsDC 
{ 
    public int ScheduleID; 
    public List<ScheduleRateLineItem> MinRateList; 
    public List<ScheduleRateLineItem> MaxRateList; 
    public List<ScheduleRateLineItem> VotRateList; 
    public List<ScheduleLOSRateDC> LosRateList; 
    public List<ScheduleRateParamsDC> RateParams; 
} 

Так что, когда я новый это я делаю это ...

Может Unity 1,1 помочь мне в любом случае здесь? Я хотел бы просто использовать var x = new ScheduleDetailsDC(), и эти 5 внутренних списков будут инициализированы для меня. Может ли Unity сделать что-нибудь для меня здесь? Обратите внимание: я никогда раньше не использовал DI.

Спасибо за любые указатели, ~ ск в Сан-Диего

ответ

2

Лучше всего сделать было бы инициализировать списки в конструкторе и запретить прямой доступ к ним из других классов, делая их в свойства:

public class ScheduleDataDetailsDC 
{ 
    public ScheduleDataDetailsDC() 
    { 
     this.MinRateList = new List<ScheduleRateLineItem>(); 
     //inialise other lists 
    } 

    public List<ScheduleRateLineItem> MinRateList { get; private set; } 
    ... 
} 

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

0

Да Unity может помочь вам, но я думаю, что это не так. Вы можете просто инициализировать свои списки, пока ваш объект не предоставит им экземпляры по умолчанию, Unity, поскольку любой другой контейнер IoC не должен использоваться как простой объект-строитель (несмотря на это).

0

Я не уверен, что конкретно детали выпуска Unity 1.1, но, вообще говоря, всякий раз, когда вы используете Инверсия управления контейнера, вы должны пройти следующие шаги:

  1. Регистре типы вашего контейнера IoC (Unity в вашем случае) знают. Сюда входят все основные типы, которые вы планируете запросить, а также все зависимые типы. В вашем случае вам нужно сообщить об этом ScheduleDataDetailsDC, и что именно нужно входить в каждый из списков, которые считаются зависимыми.
  2. Ваши типы должны указывать все необходимые зависимости в качестве аргументов конструктора. Это то, что будет использовать контейнер IoC для определения того, что нужно вводить. Если у вас есть дополнительные зависимости, вы можете использовать Property Injection для поддержки этого (если ваш контейнер IoC поддерживает его, что, я думаю, Unity делает)
  3. Вы должны запросить экземпляр зарегистрированного типа из контейнера. Как именно вы это делаете, зависит от вашего контейнера. Должен быть такой метод, как Get<T>() или Resolve<T>. Обычно вы собираетесь запрашивать экземпляры классов «Самый высокий уровень», то есть те, которые используются где-то рядом с точкой входа для вашего программного обеспечения. Если вы это сделаете, и вы применили Dependency Injection для всех зависимых классов по строке (и вы правильно зарегистрировали все зависимые типы), вы должны получить объект со всеми его включенными зависимостями, а также все из этих зависимостей объектов должен быть поставлен, и по линии.

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

Так что, учитывая все это, трудно точно сказать, что будет задействовано в использовании Unity в ситуации, описанной выше. Во-первых, вам нужно будет зарегистрировать ScheduleDataDetailsDC, но для получения зависимостей вам также потребуется зарегистрировать каждый из типов List, или, более конкретно, каждый конкретный объект, который будет отображаться в каждом списке (и, конечно, все зависимости для эти классы). Поскольку я не совсем уверен, какова роль этих списков, мне трудно сказать, как вы могли бы это сделать (или даже если бы вы могли это сделать).

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