2014-01-31 2 views
1

Я много исследовал теорию инъекций зависимостей, и это имеет большое значение, за исключением того, что, по-видимому, в некоторых сценариях возникает сложность/раздувание.PHP Dependncy Injection & Complexity

Во-первых, предполагается, что экземпляр контейнера DI никогда не передается ни одному объекту. Плохая практика и все такое ...

Например: рассмотрите класс «пользователь», который относится ко всем другим бизнес-объектам, созданным в системе, для/для определенного пользователя.

Если экземпляр пользователя должен быть удален, все связанные объекты (например, записи, файлы, изображения и т. Д.) Также необходимо удалить. Означает ли это, что экземпляр каждой зависимости должен быть введен в пользовательский экземпляр, чтобы разрешить поиск и удаление всех связанных объектов? то есть экземпляр ImageMapper (или ImageMapperFactory) должен быть передан, чтобы удалить все изображения, созданные/загруженные удаляемым пользователем экземпляром пользователя?

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

Я нахожу его повторяющимся снова и снова в статьях & учебников, которые программист должен избегать использования «нового» в любом классе, таком как чума. Однако действительно ли это возможно для экземпляров контроллеров, которым может потребоваться создать множество представлений или тому подобное?

Будет рассмотрен конкретный пример соблюдения SOLID-мантры, по крайней мере, в отношении DI ... Тот, который дает понять, как можно либо заполнить экземпляры ВСЕХ требуемых зависимостей в классе контроллера, либо как будут ли найдены или созданы лучшие экземпляры таких зависимостей?

ответ

0

Я не знаю PHP, но я попытаюсь объяснить некоторые вещи, поэтому ваш вопрос не будет забыт, так голый со мной. ;-)

Я считаю, что инъекции зависимость лучше всего работает путем разделения приложения в слоях:

  • Presentation Layer - Some интерфейс (пользовательский), который обеспечивает взаимодействие с приложением.
  • Business Logic/Service Layer - фактическое поведение вашего приложения.
  • Стойкость/уровень доступа к данным - уровень, который хранит/считывает данные из внутреннего блока (попробуйте найти шаблон репозитория).

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

Когда ваша логика приложения заявляет, что изображения пользователя должны быть удалены при удалении пользователя, вы захотите это в среднем слое (бизнес-логика). Уровень бизнес-логики вызывает уровень доступа к данным для удаления объектов.

Давайте продемонстрируем использование Python (надеюсь, вы сможете это прочитать).

# Define a class that manages users. 
class UserService: 
    # A constructor accepting dependent DAL instances. 
    def __init__(self, user_repo, image_repo): 
     self.user_repo = user_repo 
     self.image_repo = image_repo 

    def delete(self, user): 
     self.user_repo.delete(user) 
     self.image_repo.delete(user.profile_picture) 

аргументов РЬИХ, которые идут в конструкторе, являются экземплярами классов репозитория, это зависимость инъекции (инъекции конструктора).

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

+0

siebz0r, вы подтвердили вывод, к которому я медленно приступал, продолжая исследования по проблеме. Особенно уровень сервиса :) Я скептически относился к концепции уровня обслуживания, потому что я был убежден, что это противоречило правилу дяди Боба «без глаголов в классе/объектах». продолжение ... – Nibbl3r

+0

Однако теперь ясно, что уровень обслуживания/аспект имеет определенное место в структуре MVC, посредством чего модель представляет объекты данных домена, только «осознавая» себя (то есть S в SOLID) и обрабатывая дескрипторы уровня обслуживания бизнес-логика, которая, в свою очередь, имеет смысл «тонких контроллеров и моделей жира», если логически мыслить. «Толстая» модель предназначена для указания/поддержки принципа единой ответственности imho и распространяется на идею о том, что вы не должны просто забивать автобус. логика от контроллера в модель, а скорее отдельные проблемы, так что сервисный уровень имеет смысл. – Nibbl3r

+0

Я все еще размышляю о соответствующей/применимости шаблона репозитория, когда присутствуют данные. Репозиторий просто чувствует себя немного странно, особенно учитывая, что вы часто занимаетесь извлечением и представлением нескольких экземпляров объектов домена, но чаще всего работаете (например, редактируете/обновляете) только на одном экземпляре за раз, что делает такие карты данных такими хорошая посадка. – Nibbl3r