Помощь с внедрением зависимостей в приложении MVC - PullRequest
9 голосов
/ 06 января 2011

Приложение Zend Framework / Doctrine 2.

Если возможно, я хотел бы сохранить свои услуги в качестве POPO.Какой лучший способ получить доступ / ввести EntityManager в моем классе обслуживания?Я новичок в DI, поэтому этот вопрос.EntityManager доступен как ресурс начальной загрузки в моих контроллерах.

Должен ли я просто написать абстрактный класс для служб для доступа к EntityManager?Должен ли я написать класс для создания экземпляров моих сервисов, внедряя EntityManager через конструктор / установщик? ... который будет включать интерфейс для моих сервисов.Должен ли я использовать DI Framework?Если да, то какой и как?

Или есть другой, лучший способ сделать это?

Я прочитал о внедрении зависимостей, но все еще не полностью понял в этом контексте.


Обновление (12 января 2011 г.)

Итак, это мое текущее рабочее решение: у меня есть помощник действий под названием Resource, это помощник для извлечения ресурсов из начальной загрузки или вы можете вручную добавить ресурсы к нему: http://pastie.org/1450851

$this->_helper->Resource('em'); // get EntityManager

Может ли кто-нибудь рассказать о влиянии на производительность локального хранения ресурсов начальной загрузки в классе помощника?Я переусердствовал в этом?
TODO: Измените таблицу ресурсов из класса.

И у меня есть помощник действий для загрузки служб: http://pastie.org/1450855
TODO: Добавьте проверки перед попыткой загрузкиservice.

Пожалуйста, предоставьте некоторую критику в отношении вышесказанного:)

Ответы [ 2 ]

5 голосов
/ 06 января 2011

Чтобы отделить сервисный уровень от остальной части приложения, я часто буду полагаться на свои контроллеры для управления инъекцией. Мне еще предстоит сломать и использовать DI-контейнер, но описанный здесь инжектор ресурсов отлично подходит для передачи EntityManager вокруг моего приложения.

EntityManager создается на начальной загрузке как ресурс, и ActionHelper добавит его в контроллер, если контроллер запрашивает его. Затем я передам его объектам обслуживания, используя инжектор конструктора или метод инсталляции.

class MyController extends Zend_Action_Controller
{
    // A little different from O'Phinney's implementation. I'm adding
    // the resource named 'entitymanager' as the public property $em.
    public $dependencies = array(
      'entitymanager' => 'em'
    );

    public function myAction()
    {
       $service = new MyService($this->em);
       // or...
       $service = new MyService();
       $service->setEntityManager($em);
    } 
}

Я также использую интерфейс под названием IHasEntityManager.

Если вы не хотите, чтобы ваш контроллер отвечал за создание объектов Service, вы можете посмотреть в DI-контейнер, такой как Symfony Dependency Injection .

2 голосов
/ 06 января 2011

Бен Шольцен ( @ DASPRiD ) имеет пример собственной псевдо-структуры DI в исходном коде для своего блога. Он использует настраиваемые картографы для своей настойчивости, которые он передает каждому сервису при создании экземпляра сервиса. Но кажется, что было бы легко изменить, чтобы принять экземпляр Doctrine2 EntityManager вместо этого.

...