Могу ли я воспользоваться преимуществами инъекции зависимостей здесь? - PullRequest
0 голосов
/ 23 июня 2010

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

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

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;
}

Так что, когда я его создаю, я делаю это ...

    new ScheduleDataDetailsDC{
                    LosRateList = new List<ScheduleLOSRateDC>()
                    , MaxRateList = new List<ScheduleRateLineItemDC>()
                    , MinRateList = new List<ScheduleRateLineItemDC>()
                    , RateParams = new List<ScheduleRateParamsDC>()
                    , VotRateList = new List<ScheduleRateLineItemDC>()
                }

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

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

Ответы [ 3 ]

2 голосов
/ 23 июня 2010

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

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

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

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

0 голосов
/ 23 июня 2010

Я не совсем уверен, каковы подробности выпуска 1.1 Unity, но, вообще говоря, когда вы используете Inversion of Control Container, вы должны выполнить следующие шаги:

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

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

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

0 голосов
/ 23 июня 2010

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

...