Использование фильтров коллекции NHibernate с коллекциями DDD - PullRequest
2 голосов
/ 12 октября 2009

Я пытаюсь сопоставить модель домена в NHibernate. Модель предметной области реализована в стиле, который я считаю DDD. Отображение в основном работает, но затем, когда я пытаюсь использовать фильтр коллекции для коллекции, я получаю исключение, которое говорит: коллекция не имеет ссылок.

Я знаю, что проблема в том, как я реализовал коллекцию. Мой вопрос: возможно ли использовать фильтры коллекций в nHibernate для коллекций, реализованных таким образом, или я должен просто забыть об этом, то есть nHibernate не может работать с этим.

Код выглядит следующим образом:

Person
{
   IList<Address> _addresses = new List<Address>();
   public string FirstName {get; set;}
   ...
   public void addAddress(Address address)
   {
      // ... do some checks or validation
      _addresses.Add(address);
   }

   public void removeAddress(Address address) {...}

   public ReadOnlyCollection<Address> Addresses 
   { 
      get { return new ReadOnlyCollection<Address>(_addresses); }
   }
}

Основная проблема в том, что я не хочу публично раскрывать коллекцию внутренних адресов. Все остальное работает, я использую доступ field.camelcase-underscore, чтобы nHibernate напрямую взаимодействовал с полем. Я работал над книгой Hibernate in Action, и теперь я нахожусь в главе 7, где речь идет о фильтрах коллекций.

Есть ли способ обойти это? Я заставил его работать, выставив внутреннюю коллекцию так:

public ReadOnlyCollection<Address> Addresses 
{ 
   get { return _addresses; }
}

но я действительно не хочу этого делать.

Помощь будет очень признательна.

Jide

1 Ответ

0 голосов
/ 13 марта 2011

Если я правильно помню - фильтр NHibernate работает как дополнительное предложение в запросах sql, чтобы уменьшить количество возвращаемых строк из базы данных.

Мой вопрос к Вам - зачем Вам это нужно?
Я имею в виду - сколько адресов может иметь один человек? 1? 5? 10


Об изоляции коллекции ...

Я сам просто принимаю это как жертву для NHibernate (точно так же, как ctor и "virtual`ity" без аргументов) и использую открытые IList везде (с частными сеттерами) только для уменьшения технической сложности. Их содержание, конечно, может быть изменено извне, но я просто не делаю этого.

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

...