В настоящее время я пытаюсь понять, как разрабатывать DDD-классы, без каких-либо предположений о реализации, которые могут потребоваться для их использования. Мне удалось создать небольшую структуру, созданную из пользовательского объекта с именем User
, который реализует интерфейс IUser
, поэтому я могу сохранить эффективную абстракцию для повторного использования.Адаптация DDD-интерфейсов к конкретной реализации
Теперь я хотел бы использовать этот пользовательский объект в конкретной реализации, используя Symfony2 в моем случае. Чтобы воспользоваться уровнем безопасности Symfony, мой пользовательский объект должен реализовать интерфейс UserInterface
, предоставляемый Symfony.
Если я правильно понял шаблон, это была бы отличная возможность реализовать адаптер под названием UserAdapter
, который позволил бы мне заставить мой пользовательский класс работать с Symfony. Пока все хорошо, это прекрасно работает. Но здесь идет моя проблема:
Предположим, я добавляю класс Comment
в свою DDD-библиотеку, у которой есть атрибут $user
. Чтобы связать пользователя с комментарием, я использую, например, установщик setUser()
, который требует всего, что реализует интерфейс IUser
. Если завтра я хочу изменить класс пользователя, который будет использоваться в этом контексте, все, что мне нужно, это новый пользовательский класс, который реализует интерфейс IUser
.
Но в моей конкретной реализации, например, в контроллере Symfony, я использую экземпляр класса UserAdapter
, который реализует интерфейс Symfony UserInterface
. При вызове setter setUser()
на моем объекте Comment
интерфейс не совпадает.
Что мне не хватает?
Я использую шаблон адаптера неправильно, следует ли использовать другую стратегию в моей реализации?
Я думал о 2-м решении, которое теоретически хорошо, поскольку оно использует композицию, но я также стараюсь избежать сложности для конечного разработчика. Используя делегирование, я заставляю их делать предположения о том, как скомпилированы бизнес-объекты, если я не разработаю какой-либо другой адаптер для моего объекта «Комментарий», который будет служить промежуточным слоем для правильной установки пользователя. Использование наследования, если я разрабатываю объекты, похожие на Symfony, с каждым, расширяющим их эквивалент DDD lib, было бы хорошим решением?Он гарантирует, что объекты, используемые в контексте приложения Symfony, действительно совместимы с Symfony. – bench1ps
Наследование будет проблемой только в том случае, если вы планируете наследовать другой класс DDD 'User' в приложении Symfony2. – sebbo