Julie Lerman氏は先日,Entity Frameworkでprivateなコンストラクタとprivateなプロパティセッタを持つクラスの操作が可能なことを指摘した。
氏の公開したテストを見れば,Entity Framework(EF)ではprivateなセッタへのデータの設定や,privateコンストラクタの呼び出しが,さほど難しくないということが分かる。さらにEFがEntityProxyFactoryとその関連クラスを参照してこれを行っていることや,リフレクションとIL Emitの組み合わせが要点であることなども理解できるはずだ。NHibernateはさらに一歩進んで,privateなフィールドへのアクセスまでもサポートしている (EFでもすでに検討されている)。ただしどちらも,現時点ではデフォルトコンストラクタ(publicでなくてもよい)が必要だ。
一般的な方向性として,これは悪いことではない。氏も述べているように,永続性非依存(persistence ignorance)を促進するものだからだ。
アーキテクチャ面では,Entiry FrameworkとNHibernateはどちらも永続性非依存を支援するパターンをサポートする –
それぞれに対して,Entity FrameworkにはDBSetとDBContextがあり,NHibernateにはQueryOverAPIとSessionContextがある。ただしその一方で,遅延ローディングのサポートに関してはどちらも今のところ,この方針とは相反するVirtual Proxyパターン(プロパティをvirtualにする必要がある)を使用している。
永続性非依存は一般論としてよいプラクティスと見なされている。いわゆるActive Recordパターンを使った場合とは違い,ビジネスルールを永続化ロジックから分離することが可能だからだ。これによって設計全体がシンプルに,よりテストしやすいものになる。