NHibernate 'proxy'の簡単な定義を教えてください。例としてNHibernateの「プロキシ」は基本的に何を意味するのか説明できますか?
、このアクション帳にマニングNHibernateのからの引用である:
「または 協会、遅延フェッチは、関連するクラスのマッピング がプロキシを可能にする場合にのみ 可能です。」
NHibernate 'proxy'の簡単な定義を教えてください。例としてNHibernateの「プロキシ」は基本的に何を意味するのか説明できますか?
、このアクション帳にマニングNHibernateのからの引用である:
「または 協会、遅延フェッチは、関連するクラスのマッピング がプロキシを可能にする場合にのみ 可能です。」
これは、元のエンティティを継承するクラスを作成し、関連付けられたクラスを表す実際のプロパティをオーバーライドすることを意味します。
これにより、DBからデータをフェッチして、そのデータを常に利用できるようにする代わりに、怠惰を達成するためのロジックを実装できます。
しかし、これは、NHibernateバージョンのISetとIListなどで実装されています。これは、多対1または一対一の関係でのみ関連します。
例:
public class YourEntity {
public virtual OtherEntity Entity { get; set; }
}
public class DynamicProxyEntity : YourEntity {
private OtherEntity entity;
public override OtherEntity Entity {
get { return entity = LoadFromDb(); }
set { this.entity = value; }
}
}
これがうまくいけば、それはあなたにそれがどのように動作するかの洞察を与えるだろう、それは非常に単純化したバージョンです。もちろん、実際のEntityタイプのインスタンスを持たないため、これはアプリに問題をもたらす可能性がありますが、派生型のインスタンスです。属性などでクラスを修飾した場合は、コードによって識別されない可能性があります。また、注意しないとタイプチェックなどが壊れることがあります。
怠惰な関連があるときNHibernateは、データベースにヒットして適切なエンティティを取得するために、アソシエーションを指し示すプロパティがコードによって要求されたときを知る必要があります。これはクラスを「プロキシ」することによって行われます。つまり、クラスから派生し、プロパティの取得と設定を上書きすることを意味します。これは、エンティティクラスがパブリックプロパティvirtual
を持つ必要があるため、生成される派生(プロキシ)クラスでオーバーロードされる可能性があります。プロキシは、設定で指定されたプロキシファクトリによって自動的に作成されます。
これを達成するためにCodeDomを使用していますか? – pencilCake
私は内部の仕組みに精通していませんが、Castle.DynamicProxy2(http://www.castleproject.org/dynamicproxy/index.html)を使用していると思います。そのソースコードを確認できます。 – jishi