2

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); }
   }
}

主な問題は、内部アドレス コレクションを公開したくないということです。nHibernate がフィールドと直接対話するように、field.camelcase-underscore アクセスを使用します。私は Hibernate in Action の本に取り組んできましたが、今はコレクション フィルターを扱う第 7 章にいます。

これを回避する方法はありますか。次のように内部コレクションを公開することで機能するようになりました。

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

しかし、私は本当にこれをしたくありません。

助けていただければ幸いです。

ジデ

4

1 に答える 1

0

私の記憶が正しければ、NHibernate フィルターは SQL クエリの追加句として機能し、db から返される行を減らします。

あなたへの私の質問は - なぜあなたはそれが必要なのですか?
つまり、1 人が持っているアドレスの数は? 1? 5? 10?


コレクションの分離について...

私自身は、NHibernate の犠牲としてそれを受け入れ (引数のない ctor や "virtual`ity" と同様)、公開された IList をどこでも (プライベート セッターを使用して) 使用して、技術的な複雑さを軽減しています。それらの内容は確かに外部から変更できますが、私はそれをしません。

コードを非常に安全にすることよりも、コードを理解しやすいものにしておくことが重要です。安全が続きます。

于 2011-03-12T23:17:30.780 に答える