2011-06-23 5 views

答えて

2

これは、元のエンティティを継承するクラスを作成し、関連付けられたクラスを表す実際のプロパティをオーバーライドすることを意味します。

これにより、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タイプのインスタンスを持たないため、これはアプリに問題をもたらす可能性がありますが、派生型のインスタンスです。属性などでクラスを修飾した場合は、コードによって識別されない可能性があります。また、注意しないとタイプチェックなどが壊れることがあります。

+0

これを達成するためにCodeDomを使用していますか? – pencilCake

+1

私は内部の仕組みに精通していませんが、Castle.DynamicProxy2(http://www.castleproject.org/dynamicproxy/index.html)を使用していると思います。そのソースコードを確認できます。 – jishi

2

怠惰な関連があるときNHibernateは、データベースにヒットして適切なエンティティを取得するために、アソシエーションを指し示すプロパティがコードによって要求されたときを知る必要があります。これはクラスを「プロキシ」することによって行われます。つまり、クラスから派生し、プロパティの取得と設定を上書きすることを意味します。これは、エンティティクラスがパブリックプロパティvirtualを持つ必要があるため、生成される派生(プロキシ)クラスでオーバーロードされる可能性があります。プロキシは、設定で指定されたプロキシファクトリによって自動的に作成されます。

関連する問題