Проблема проектирования для DDD и объекта User, реализующего интерфейс пользователя Symfony - PullRequest
0 голосов
/ 12 октября 2018

Почему документы Symfony предлагают реализовать интерфейс UserInterface на моем домене. Пользовательский объект?

https://symfony.com/doc/3.4/security/entity_provider.html

class User implements UserInterface, \Serializable {}

Мне кажется, это нарушает базовый подход DDD, потому что мой доменсущности никогда не должны полагаться на то, что находится за пределами домена (в этом случае UserInterface является компонентом Symfony).

Проблема заключается в том, что UserPasswordEncoder объекту Symfony нужен UserInterface для получения соли / пароля от пользователей.

В настоящее время у меня есть очень схематичное решение, которое не является пуленепробиваемым / масштабируемым вообще, поэтому я ищу решения.

Нужно ли мне реализовать свой собственный UserPasswordEncoder, который можетработать непосредственно с моей сущностью пользователя домена?

1 Ответ

0 голосов
/ 15 октября 2018

Мне кажется, что это нарушает базовый подход DDD, потому что мои доменные сущности никогда не должны полагаться на то, что находится за пределами домена (в этом случае UserInterface является компонентом Symfony).

Теоретически вы правы.Ваши агрегаты никоим образом не должны зависеть от инфраструктуры.

Многие платформы ориентированы на обеспечение быстрой доставки программного обеспечения, а не на чистый код.Из того, что мы видели, Symfony больше подходит для CRUD-сущностей, в простых доменах, а не для сложных доменов, где DDD больше подходит.Это означает, что, возможно, вам не следует использовать DDD в этом домене, и, возможно, будет достаточно сущности CRUD.

Или, может быть, если вы думаете, что User действительно должен быть агрегатом DDD, поскольку он имеет сложное поведение, тоВы должны извлечь UserPassword в свою собственную сущность CRUD, которая не связана с ограничениями DDD.Затем в вашем User Aggregate вы ссылаетесь на пароль только по идентификатору, то есть private $passwordId;.

Нужно ли мне реализовывать свой собственный UserPasswordEncoder, который может работать непосредственно с моей сущностью пользователя домена?

Я думаю, это будет то же самое, что и компонент инфраструктуры, по крайней мере, с точки зрения DDD.Хеширование паролей является компонентом инфраструктуры, независимо от того, кто его реализует.

...