Как отобразить классы в NHibernate, используя Roles или Composition - PullRequest
6 голосов
/ 22 октября 2008

Я считаю, что это распространенный вопрос / проблема, но не смог найти хороший, чистый, краткий ответ.

Проблема

Как отобразить сущности, которые, по-видимому, имеют отношения наследования:

Company
  Supplier
  Manufacturer
  Customer

Однако, Поставщик может быть Производителем.

или

Person
  Doctor
  Patient
  Employee

Если пациент может быть врачом или сотрудником.

Предложение: использовать роли

В дискуссиях на форумах NHibernate часто говорят, что это множественное наследование.

http://forum.hibernate.org/viewtopic.php?t=959076

Их решение - использовать композицию или использовать «роли». Однако я не могу найти никаких примеров или объяснений, как именно это сделать.

«Пользуйся композицией, а не наследством». Помни это маленькое лакомство из учебный класс? В этом случае я должен согласен, что вы пытаетесь несколько наследование - невозможно в C # или Ява (пока). Я бы лично призываю вас думать о перемоделирование, чтобы у вас был человек объект и человек имеет один ко многим Сборник ролей.

Ответы [ 3 ]

4 голосов
/ 23 октября 2008

Возможно, вы захотите рассмотреть вопрос об использовании ролей. Таким образом, Роль будет иметь набор Персонов. Или человек будет иметь набор ролей или оба. Это, вероятно, будет означать, что существует класс Association, который отображает людей на роли.

Определите класс Person со всеми общими для людей свойствами. Затем определите суперкласс Role и подклассы DoctorRole, PatientRole и EmployeeRole (при условии, что каждая роль имеет разные свойства).

Класс Person может иметь определенную коллекцию ролей, а класс Role может иметь определенную коллекцию людей. Или может быть проще создать класс Ассоциации, назовем его PeopleRole.

На этой странице объясняется, как выполнить сопоставление, чтобы PeopleRole был составным элементом. Посмотрите пример Order / Product / LineItem. Ваша персона - как Порядок, PeopleRole - как LineItem, а Роль - как Продукт.

3 голосов
/ 23 октября 2008

Мне кажется, что это больше вопрос, как правильно моделировать домен, а не проблема отображения NHibernate.

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

Единственное место, где можно получить представление о моделировании ролей, это поискать " Color Modeling " - Джефф де Лука имеет некоторые ресурсы Хотя идея возникла с Питер Коад

Основная идея состоит в том, чтобы отделить личность участника от роли, которую они играют в деятельности.

Например, у вас может быть объект Person, который фиксирует личность конкретного человека.

Затем создается совершенно отдельный объект «Студент», в котором фиксируется дополнительная информация для записи зачисления человека в качестве студента. Каждый экземпляр Student должен иметь ссылку на зарегистрированного человека. Один человек может быть связан со многими записями «Студента», по одному на каждую отдельную запись.

Параллельно у вас может быть отдельный объект типа «Репетитор», который записывает детали трудоустройства, когда кто-то нанимается для обучения студентов в ситуациях один на один. Объект Tutor фиксирует дополнительную информацию о том, как кто-то работает в качестве наставника.

Эта структура дает вам большую гибкость - один человек (Джо Блоггс) может быть просто студентом, другой человек (Джейн Доу) может быть просто репетитором, а третий (Чак Норрис) может быть обоим.

Кроме того, введение другой роли (лектор, маркер, администратор) упрощается, поскольку для добавления не требуется вносить изменения в существующие объекты.

1 голос
/ 16 октября 2009

Я наткнулся на немного больше комментариев, которые могут вас заинтересовать:

В блоге в блоге Naked Objects изложены несколько различных подходов, обсуждающих плюсы и минусы каждого из них.

  • Использование сопоставления «Любой»
  • Моделирование ролей как классов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...