0

私はNHibernateフォーラムでこれを尋ねましたが、これはより一般的な質問だと思います. Hibernate はプロキシ ジェネレータ (Castle など) を使用してプロキシを作成します。

私がやりたいことは、生成されたプロキシを拡張して、独自のカスタム動作 (つまり比較機能) を実装することです。次の標準的な .NET の動作では正しい結果が得られないため、これが必要です。

//object AC is a concrete class
collection.Contains(AC) = true

//object AP is a proxy with the SAME id and therefore represents the same instance as concrete AC
collection.Contains(AP) = false

私の比較子が AP によって実装された場合 (つまり、id の一致を行う場合)、collection.Contains(AP) は、プロキシが暗黙的である場合に予想されるように、true を返します。(NB: NH が基本クラスから継承されていると言う人にとっては、そうですが、NH はインターフェイスから継承することもできます。これが私たちが行っていることです)

これが可能か、どこから始めればよいか、まったくわかりません。これは、NH が使用する一般的なプロキシ ジェネレーターのいずれかで実行できるものですか?

4

2 に答える 2

2

Castle DynamicProxyでは、選択肢がほとんどありません。

1つは、プロキシを作成するときにのIComparer<T>1つとして提供することです。インターフェイスには続行する実際の実装がないため、呼び出す代わりにメソッドの実際のロジックをadditionalInterfacesToProxy提供するインターセプターを提供する必要があります。Proceed

または、必要なインターフェイスを実装し、必要なロジックを提供するミックスインを提供することもできます。ほとんどの場合、ミックスイン参照をプロキシまたはそのターゲットに戻す必要があることに注意してください。

インターフェイスプロキシでのみ使用可能な3番目のオプションは、基本クラスを設定することです。proxyGenerationOptions.BaseClassForInterfaceProxy = typeof(SomethingImplementingComparer);

于 2010-05-03T05:46:39.437 に答える
0

この種の動作は LinFu.DynamicProxy で可能ですが、NHibernate が提供するインターセプターを独自のカスタム インターセプターに置き換えて、呼び出しを元のインターセプターに委任する必要があります。

var yourProxiedInterfaceInstance = ...

// Get the Interceptor that NHibernate uses

var proxy = (IProxy)yourProxiedInterfaceInstance;

var interceptor = proxy.Interceptor;

// You'll need to create a decorator class around the IInterceptor interface
var yourInterceptor = new SomeCustomInterceptor(interceptor); 

// Replace the interceptor here
proxy.Interceptor = yourInterceptor;

LinFu が生成するすべてのプロキシ インスタンスはインターセプタを必要とするため、これは LinFu で行うのは非常に簡単です。インターセプターを変更すると、プロキシの動作を自動的に変更できます。それが役立つことを願っています。

于 2010-05-02T22:12:33.090 に答える