Внедрение зависимостей, внедрение «внедряемого» объекта (службы )в новый (объект)

При написании кода мы должны уметь идентифицировать две большие группы объектов:

  • Инъекционные препараты
  • Новинки

http://www.loosecouplings.com/2011/01/how-to-write-testable-code-overview.html

http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/

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

  • . Новые объекты — это объекты, которые также раскрывают зависимости в своих конструкторах, но новые объекты могут запрашивать только другие новые объекты (Сущности, объекты значений ), еще одна характеристика новых объектов — они не должны содержать ссылку на внедряемый объект

Но при написании кода нам часто нужно «внедрить» сервис (внедряемый )в Entity (новый)

Я думал, что, возможно, раскрытие зависимости службы в новом объекте лучше делать это на уровне метода, но это звучит как много работы... просто думаю о разрешении зависимостей каждый раз, когда вызывается метод...... ну, это пахнет так, как будто нам придется использовать анти-паттерн -Service Locator

Как я решил это:

  • Создайте интерфейс с методом, раскрывающим зависимость (, служба будет использоваться в этом методе)

  • Создайте метод расширения для интерфейса и поместите его в другое пространство имен, возможно, в другую сборку, и просто оберните вызов исходного метода, разрешающего зависимость с помощью локатора службы

. Делая это, мы имеем последовательное разделение между новыми и внедряемыми объектами с возможностью легко использовать сервисы в наших новых объектах

  • . Что вы думаете?
  • Использование локатора службы в методе расширения считается плохой практикой?
  • Как бы вы с помощью модуля -протестировали вызов метода расширения?

7
задан Jupaol 14 March 2012 в 11:18
поделиться