2014-01-03 3 views
1

В настоящее время я пытаюсь понять, как разрабатывать DDD-классы, без каких-либо предположений о реализации, которые могут потребоваться для их использования. Мне удалось создать небольшую структуру, созданную из пользовательского объекта с именем User, который реализует интерфейс IUser, поэтому я могу сохранить эффективную абстракцию для повторного использования.Адаптация DDD-интерфейсов к конкретной реализации

Теперь я хотел бы использовать этот пользовательский объект в конкретной реализации, используя Symfony2 в моем случае. Чтобы воспользоваться уровнем безопасности Symfony, мой пользовательский объект должен реализовать интерфейс UserInterface, предоставляемый Symfony.

Если я правильно понял шаблон, это была бы отличная возможность реализовать адаптер под названием UserAdapter, который позволил бы мне заставить мой пользовательский класс работать с Symfony. Пока все хорошо, это прекрасно работает. Но здесь идет моя проблема:

Предположим, я добавляю класс Comment в свою DDD-библиотеку, у которой есть атрибут $user. Чтобы связать пользователя с комментарием, я использую, например, установщик setUser(), который требует всего, что реализует интерфейс IUser. Если завтра я хочу изменить класс пользователя, который будет использоваться в этом контексте, все, что мне нужно, это новый пользовательский класс, который реализует интерфейс IUser.

Но в моей конкретной реализации, например, в контроллере Symfony, я использую экземпляр класса UserAdapter, который реализует интерфейс Symfony UserInterface. При вызове setter setUser() на моем объекте Comment интерфейс не совпадает.

Что мне не хватает?

Я использую шаблон адаптера неправильно, следует ли использовать другую стратегию в моей реализации?

ответ

2

Есть два решения, которые приходят мне на ум. Одно решение работает с наследованием, одно с делегированием.

  1. Наследование

    В вашем UserAdapter классе простираться от вашего класса DDD User. Также используйте адаптер Symfony2 UserInterface. Теперь реализуем методы из UserInterface с помощью атрибутов родительского класса.

  2. Делегация

    же, как и в случае наследования UserAdapter класс должен реализовывать Symfony2 UserInterface. Но теперь вы создаете ассоциацию от адаптера к конкретному классу пользователя. Таким образом, ваш адаптер «имеет одного» пользователя. Чтобы избежать использования адаптеров без пользователя, вы можете потребовать пользователя в конструкторе адаптеров. Затем вы можете вызвать метод setUser с помощью setUser($userAdapter->getUser()).

+0

Я думал о 2-м решении, которое теоретически хорошо, поскольку оно использует композицию, но я также стараюсь избежать сложности для конечного разработчика. Используя делегирование, я заставляю их делать предположения о том, как скомпилированы бизнес-объекты, если я не разработаю какой-либо другой адаптер для моего объекта «Комментарий», который будет служить промежуточным слоем для правильной установки пользователя. Использование наследования, если я разрабатываю объекты, похожие на Symfony, с каждым, расширяющим их эквивалент DDD lib, было бы хорошим решением?Он гарантирует, что объекты, используемые в контексте приложения Symfony, действительно совместимы с Symfony. – bench1ps

+1

Наследование будет проблемой только в том случае, если вы планируете наследовать другой класс DDD 'User' в приложении Symfony2. – sebbo

Смежные вопросы