nHibernate - объекты или ObjectID в классах - PullRequest
1 голос
/ 05 декабря 2010

Мы переносим текущее приложение C # для использования nHibernate.Так как nHibernate продвигает чисто доменный дизайн, мы можем добавить бизнес-объекты в качестве свойств классов или продолжать использовать ID.

Позвольте мне проиллюстрировать это на примере;

Возьмем следующееучебный класс.Адрес (и дочерние элементы) идентифицируются только по их идентификатору.

public class Person
{
    public int PersonID { get; set; }
    public string FirstName { get; set; }
    public string FirstName { get; set; }
    public int AddressID { get; set; }
    public List<int> ChildrenIDs { get; set; }
}

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

public class Person
{
    public virtual int PersonID { get; private set; }
    public virtual string FirstName { get; set; }
    public virtual string FirstName { get; set; }
    public virtual AddressObject Address { get; set; }
    public virtual List<ChildrenObject> Children { get; set; }
}

Теперь мы храним объект Address и объекты List of Children для Person.Это лучше для наших бизнес-потребностей, поскольку у нас есть вся информация при доступе к классу, и мы можем отказаться от использования идентификаторов, но вместо этого использовать базовый объект.

В этом сценарии то, что nHibernate сохранит для PersonАдрес?Сохранится ли в нем только уникальный идентификатор, назначенный для этого объекта в таблице Person?А как насчет ChildrenObject?

Ответы [ 2 ]

5 голосов
/ 05 декабря 2010

Вы должны использовать доменные объекты в качестве свойств, как во втором приведенном вами примере.

NHibernate сохранит уникальный AddressObject. Предполагается, что AddressObject будет иметь отношение один-ко-многим с классом Person, поэтому в классе AddressObject должен быть List типа Person, представляющий Persons, которые там живут. Это отношение также должно быть определено в вашем файле AddressObject.hbm.xml следующим образом:

<set name="persons" cascade="all" inverse="true" lazy="true">
    <key column="address_id"/>
    <one-to-many class="Person"/>
</set>

А в Person.hbm.xml вот так:

<many-to-one name="address"
    class="AddressObject"
    column="address_id"/>

Кроме того, почему класс предназначен для детей? Если под этим подразумевается буквальное определение детей, почему бы просто не использовать для этой цели класс Person?

0 голосов
/ 06 января 2011

Существует два основных типа объектов DDD, представляющих интерес;Entity или ValueObject.Вы, или, точнее, ваш домен, определяете контекст, в котором говорится, какой тип объекта является сущностью, а какой является объектом ValueObject.

Если объект явно является сущностью, вам следует всегда упростите свою жизнь и сохраните ее с помощью суррогатного идентификатора, даже если идентификатор не имеет значения в вашей объектной модели.Создайте класс EntityBase, который абстрагирует для вас детали идентификатора и унаследует от него Person и другие сущности.

Адрес интересен тем, что некоторые домены являются сущностями, а другие - объектами ValueObject.Если вы решите, что это объект значения, то сопоставьте его как компонент в NHibernate.

NHibernate позаботится обо всех неприятных деталях, которые связаны с тем фактом, что сохраняемые объекты сильно отличаются от объектов в памяти.

HTH,
Berryl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...