Как определить совокупный корень - доменный дизайн

У меня есть совокупность: пользователь.
Как я буду определять его совокупный корень?

потому что у меня есть:

   +User(folder)
     - User(Abstract Class)
     * Administrator(Concrete inherits from User)
     * Manager(Concrete inherits from User)
     * Maintenance(Concrete inherits from User)

Также я должен сделать репозиторий для каждого пользовательского класса (администратор, менеджер, обслуживание)? или просто сделать 1 репозиторий, который использует абстрактный класс (User)?

2 ответа

Ваш вопрос состоит из двух, хотя и взаимосвязанных частей: во-первых, я думаю, что вы понятия о совокупном и совокупном корне не точны. Следовательно, важно понять их правильно, прежде чем двигаться вперед.

Когда у вас есть отношения наследования, это не совокупная проблема. Агрегат относится к составу. Вот почему:

Давайте возьмем ваш собственный пример. У вас есть абстрактный класс User, а затем у вас есть следующие специализации User: Администратор, Менеджер, Техническое обслуживание. Теперь эти четыре не находятся в отношении агрегат-агрегат-корень. Но они все совокупные корни. Или, другими словами, каждый является совокупным корнем.

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

Ключевым моментом является понимание того, что Администратор, Менеджер, Обслуживание являются заменой для Пользователя в одном агрегате. Они не являются объектными значениями пользователя.

Вторая часть вашего вопроса о реализации. Нужно ли реализовывать отдельные классы репозитория для каждого подтипа или один для всех. Ответ на этот вопрос зависит от особенностей вашего приложения, типа используемых вами инструментов и т. Д. Не существует жесткого правила, какой из двух способов выбрать. Например, если ваши подтипы отличаются только несколькими атрибутами, может быть лучше иметь их все в одной таблице и в одном репозитории, в противном случае - в отдельных репозиториях. Например, Hibernate Framework, позволяет выбрать один из двух способов и выбор за разработчиком / дизайнером.

Но, опять же, ключевой момент заключается в том, чтобы думать об этой проблеме, как о наследовании (которым оно является), а не проблемой совокупного / совокупного корня.

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

О наследовании и репозиториях: Наследование - это большое дело для внедрения. Это может вызвать проблемы, но также может уменьшить сложность. Это зависит от того, есть ли у вас много общего общего поведения, которое можно поместить в базовый класс User. Тогда вы сможете многого добиться от полиморфизма и оставить только UserService. UserService может тогда использовать AdministratorRepository или ManagerRepository, когда это необходимо. Но проверьте, можете ли вы решить эту проблему с помощью Composition вместо Inheritance. Это не создает большой связи. Это добавляет немного больше сложности, когда вы хотите расширить с помощью нового подкласса.

Другие вопросы по тегам