2

DAL アセンブリのすべてのメソッドに対して LinFu インターセプターを作成しようとしています。私はこのようなことをすることができますが:

[Intercepts(typeof(IFirstRepository))]
[Intercepts(typeof(ISecondaryRepository))]
[Intercepts(typeof(IIAnotherRepository))]
public class DalInterceptor : IInterceptor, IInitialize
{
... 
}

これは非常に面倒で、新しいリポジトリがアセンブリに追加されるたびに手動で更新する必要があります。

アセンブリ内の型ごとにプロキシ クラスを自動的に作成する方法はありますか?

アップデート:

著者自身 (Laureano 氏) からの提案を使用してプロキシ ビルダーを更新したので、次のようになりました。

Func<IServiceRequestResult, object> createProxy = request =>
{
    var proxyFactory = new ProxyFactory();
    DalInterceptor dalInterceptor = new DalLiteInterceptor();
    return proxyFactory.CreateProxy<object>(dalInterceptor);
};

インターセプターは以前のようにセットアップされます。私が今抱えている問題は、プロキシ オブジェクトに元のオブジェクトのコンストラクタとメソッドが含まれていないことです (ジェネリック create メソッドでオブジェクトを使用していると推測しています)。

これを必要な型にキャストするだけですか、それとも根本的に間違ったことをしていますか?

ありがとう。

4

1 に答える 1

2

LinFuのIOCコンテナを使用して、コンテナによってインスタンス化されるさまざまなサービスをインターセプトしようとしているようです。LinFuにはProxyInjectorという内部クラスがあり、インターセプトするサービスと、各サービスインスタンスのプロキシを作成する方法を決定できます。サンプルコードは次のとおりです。

Func<IServiceRequestResult, bool> shouldInterceptServiceInstance = request=>request.ServiceType.Name.EndsWith("Repository");

Func<IServiceRequestResult, object> createProxy = request =>
{
   // TODO: create your proxy instance here
   return yourProxy;
};

// Create the injector and attach it to the container so that you can selectively
// decide which instances should be proxied
var container = new ServiceContainer();
var injector = new ProxyInjector(shouldInterceptServiceInstance, createProxy);
container.PostProcessors.Add(injector);

// ...Do something with the container here

編集:ProxyInjectorクラスを変更して、LinFuの内部クラスではなくパブリッククラスになりました。それを試してみて、それが役立つかどうか私に知らせてください。

于 2011-02-03T05:26:43.680 に答える