Платформа DI: как стараться не постоянно передавать введенные зависимости цепочка, и не используя сервисный локатор (конкретно с Ninject)

Я нуждаюсь в немного большем количестве помощи, чтобы "добраться", как платформа DI как Ninject перемещается мимо основ.

Возьмите образец Ninject:

class Samurai {
private IWeapon _weapon;

    [Inject]
    public Samurai(IWeapon weapon) {
      _weapon = weapon;
    }

    public void Attack(string target) {
      _weapon.Hit(target);
    }
 }

Без платформы DI (т.е. [Вводить] ссылки выше) класс ссылки посмотрел бы что-то как:

class Program {
   public static void Main() { 
    Samurai warrior1 = new Samurai(new Shuriken());
    Samurai warrior2 = new Samurai(new Sword());
    warrior1.Attack("the evildoers");
    warrior2.Attack("the evildoers");
  }
}

... где Вы - newing все. Да, Вы удалили зависимость в Самурае, но теперь у Вас есть зависимость один шаг вперед цепочка. Простой.

С Ninject Вы избавляетесь от newing все:

class Program {
  public static void Main() {
    IKernel kernel = new StandardKernel(new WarriorModule());
    Samurai warrior = kernel.Get<Samurai>();
    warrior.Attack("the evildoers");
  }
}

ОДНАКО это - моя область беспорядка: не делая некоторый сервисный локатор для заботы об эффективно newing применимое ядро и модуль (т.е..IoC.TypeResolver. Доберитесь <> ()), каков a) лучший способ не иметь к новому ядра везде (сервисные ссылки локатора везде?), и b), что еще более важно, когда у Вас есть большая длинная цепочка с зависимостями с собственными зависимостями, Вы берете ее к экстремальному значению передающих инжекций полностью в чем-то, что я уверен, серьезный антишаблон (друг назвал ее "антишаблоном" внедрения зависимости злободневной политической проблемы).

Другими словами, я думал, что часть волшебства платформы DI - то, что Вы не должны продолжать вставлять зависимости полностью цепочка (т.е. Ваша Ваша первая ссылка, содержащая 10 параметров в ее конструкторе, ни один из которых ни к чему не имеет никакого отношения до гораздо дальше вдоль цепочки) - где состоят в том волшебство или решение моего беспорядка так, чтобы зависимости или постоянно не становились ссылаемыми и цепочка или сервисное ссылочное распространение локатора везде.

Далее заиление вод для меня при использовании платформы DI, что является лучшим способом иметь дело со сценарием, где классу, на который ссылаются, нужен IList, который обычно помещался бы в конструктора (т.е. новый ReferencedClass (myList)), поскольку это, кроме в простых случаях как строковая строка соединения с базой данных, не летит. Просто сделайте свойство и установите его после newing оно/DI сервисное определение местоположения Платформы? Т.е.

var referencedClass = IoC.Get<IReferencedClass>();
referencedClass.MyList = myList;

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

14
задан Cœur 13 December 2018 в 02:45
поделиться

1 ответ

Что касается проблемы зависимости от "горячего картофеля", то этого не должно произойти. Инъекционный каркас зависимости справляется с этим за вас.

Например, если Class1 имеет зависимость от Class2, а Class2 имеет зависимость от Class3, вам не нужно вводить Class3 в Class1, чтобы учесть зависимость от Class2. Ядро будет идти по цепочке зависимостей для вас и автоматически разрешит последующие зависимости (до тех пор, пока все воспроизводимые классы зарегистрированы в ядре), когда вы запросите Class1.

Class1 зависит от Class2 зависит от Class3

Конструктору Class1 вообще не нужно упоминать Class3.

Что касается второй проблемы, то как или если это будет приспособлено, то это зависит от фреймворка. С Ninject, я думаю, вы можете использовать Bind().To().WithConstructorArgument() синтаксис для предоставления нового элемента List конструктору.

.
3
ответ дан 1 December 2019 в 16:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: