nHibernate (с замком ActiveRecord) с интерфейсами C # (особенно для DTO) - PullRequest
3 голосов
/ 12 марта 2009

Кто-нибудь использует nHibernate с объектом Domain и объектом DTO, реализованным из общего интерфейса? Я пытаюсь разделить все свои атрибуты nHibernate на объект Domain, оставив мои DTO и интерфейс чистыми.

Проблема возникает с ошибками выбрасывания nHibernate, когда он пытается связать интерфейсы с конкретными классами.

NHibernate.MappingException: ассоциация ссылается на не сопоставленный класс: IContact

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

public interface ICompany
{
    IList<IContact> Contacts { get; set; }
}

public class CompanyDTO : ICompany
{
    private IList<IContact> contacts;
    public IList<IContact> Contacts { get { return this.contacts; } set { this.contacts = value; } }

}

[ActiveRecord]
public class Company : ActiveRecordBase<Company>, ICompany
{
    private IList<IContact> contacts;
    [HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId")] 
    [ScriptIgnore]
    public IList<IContact> Contacts { get { return this.contacts; } set { this.contacts = value; } }
}

Edit:

Я хочу иметь общий интерфейс, чтобы я мог гарантировать, что они сохраняют одни и те же поля (т. Е. Опираться на компилятор для обеспечения их согласованности). Это также позволяет мне использовать DTO в части представления моего приложения, но приводит их к объектам домена для бизнеса и доступа к данным. Кроме того, решение alex не работает, потому что контакты ICompany имеют тип IList, а не IList. Я хотел бы сохранить его как IContact, чтобы мой объект DTO не знал об объекте Contact Domain.

Ответы [ 3 ]

4 голосов
/ 12 марта 2009

В вашем конкретном случае вы просто должны добавить Type = typeof(Contact) к атрибуту отображения, например:

[HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId", Type=typeof(Contact))]
0 голосов
/ 12 февраля 2010

А что мне делать, если у меня есть атрибут [HasMany]? На самом деле у него нет имени свойства «Тип», но у свойств [Свойство] и [Белонгсто] есть.

UPDATE

Ответ должен использовать CollectionType = typeof(YourType)

ОБНОВЛЕНИЕ 2

Нет, это не работает, это свойство установлено для типа коллекции, т.е. списка и т. Д. Попытка установить [HasMany (typeof (meType), ...)], но все равно не работает.

0 голосов
/ 12 марта 2009

Ну, в вашем домене вы не можете использовать IContract для ссылки на ваш домен, вместо этого используйте класс Concrete. Если вы хотите исправить свою версию, используйте просто:

[ActiveRecord]
public class Company : ActiveRecordBase<Company>
{
    private IList<Contact> contacts;
    [HasMany(Inverse=true, Table="Contact", ColumnKey="CompanyId")] 
    [ScriptIgnore]
    public IList<Contact> Contacts { get { return this.contacts; } set { this.contacts = value; } }
}

Я не вижу смысла связывать ваш домен и ваши DTO. Они связаны друг с другом и могут иметь разную информацию. Например, вы можете хранить некоторую информацию очень инкапсулированной в вашем Домене и передавать только немного другой информации. DTO предназначены для передачи данных, которыми вы хотите поделиться с верхними уровнями.

У вас может быть Базовый класс для определения вашей сущности и вашего ValueObject. Вкратце Entity: DomainEntity могут идентифицировать, что означает, что они могут быть сохранены. ValueObject = DTO не может быть сохранен (не может идентифицировать)

Посмотрите на дизайн ядра Sharp-Arch:

  • / BaseObject.cs: предоставляет базовые сервисы для сравнения объектов.
  • / Entity.cs: предоставляет объект с доменом. подпись и свойство идентифицируемого идентификатора. Это также имеет подтверждение поддержка NHibernate Validator. Объекты, которые выходят из сущности ДОЛЖЕН иметь хотя бы одно свойство [DomainSignature]; это бросит Исключение по контракту, если оно нарушено. Интерфейс IEntityWithTypedID позволяет вам бросать свой собственный.
  • / ValueObject.cs: это объект значения, в котором все его свойства используются по сравнению с другим объектом значения. Объекты которые выходят из ValueObject, может не иметь [DomainSignature] свойства; это вызовет исключение Design-By-Contract, если это нарушались.
...