Использование фильтров коллекций NHibernate с коллекциями DDD

Я пытаюсь сопоставить модель домена в 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 напрямую взаимодействует с полем. Я работал с книгой «Гибернация в действии», а теперь я нахожусь в главе 7, где речь идет о фильтрах сбора.

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

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

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

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

Джиде


person Jideo    schedule 12.10.2009    source источник


Ответы (1)


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

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


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

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

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

person Arnis Lapsa    schedule 12.03.2011
comment
Если вы открываете IList, как вы справляетесь с непосредственным изменением коллекции потребителем? Насколько я понимаю, лучше всего создать вспомогательный метод для этого, чтобы вы могли обрабатывать двунаправленные отношения. - person Mike Cole; 13.03.2011
comment
@ Майк, я с этим не справлюсь. Вот что я имел в виду под жертвой. Я просто придумываю соглашение, чтобы этого не делать. Может не сработать, если у вас нет контроля над потребителями (для меня это легко - у меня даже нет команды в моем проекте, я один). Что вы имели в виду, говоря о вспомогательных методах, управляющих двунаправленными отношениями? - person Arnis Lapsa; 13.03.2011
comment
@Mike, как бы вы справились с возиться с отражением и изменением частной коллекции? :) - person Arnis Lapsa; 13.03.2011
comment
LOL, хорошая мысль. Я бы, наверное, поставил какое-то предупреждение, чтобы ударить кого-нибудь по голове, если они это сделают. - person Mike Cole; 13.03.2011