4

フォームnhibernate3.2をnhibernate3.3にアップグレードしたところ、次のようにドメインクラスで多数の仮想メンバーが定義されました。

public virtual ICollection<Movie> Movies { get; private set; }

これはアップグレード後に機能しなくなり、次の例外が発生します。

Following types may not be used as proxies:
ClassName: method set_Movies should be 'public/protected virtual' or 'protected internal virtual'

これで、セッターを保護に変更することで問題を解決できましたが、Collectionプロパティをバッキングフィールドで読み取り専用に変更するとうまくいくことにも驚きました。

だから私は2つの質問があります:

  1. NHibernateがプライベートセッターの使用を禁止することにしたのはなぜですか?以前にサポートされていた.netからの技術的制限のようには見えません。コレクションのRemove()、Add()などのメソッドを使用して操作する必要があるため、設計の観点からは実行しないでください。それでも、なぜ保護されたセッターとパブリックセッターを許可するのですか?

  2. バッキングフィールドで読み取り専用プロパティを使用するのはなぜ(そしてどのように)機能するのですか?

4

1 に答える 1

7

NHibernateはプロキシジェネレータをそのアセンブリに統合し、(間違っている場合は訂正してください)使用されている実装はプライベートセッターを処理できません。

ただし、セッターがない場合は、バッキングフィールドを検索しようとし(そうでない場合は設定できないため)、読み取り専用はコンパイル時の機能であり、リフレクションを使用する場合は無視されます。

于 2012-10-22T14:01:59.333 に答える