2011-02-02 4 views
2

DALアセンブリのすべてのメソッドに対してLinFuインターセプタを作成しようとしています。非常に厄介な取得と手動更新に新しいリポジトリがアセンブリに追加されるたびに必要だアセンブリ内のすべてのタイプのLinFuインターセプタを作成する

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

:私はこのような何かを行うことができますが。

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

UPDATE:

私は著者自身(ミスターLaureano)からの提案を使用して、私のプロキシビルダーを更新しましたので、私は今、この持っている:

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

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

私はこれを必要なタイプにキャストしているのですか、それとも根本的に何か間違っていますか?

ありがとうございました。

+0

PostSharpについて聞いたことがありますか?それはLinFuでやっていることよりも、表現力をより豊かにします。 –

+0

私たちはLinFuを主にIoCコンテナとして使用しています。アスペクトはデバッグ中にトレースを追加するだけです。私たちはLinFuの弓を使用することに非常に固執していますが、私はPostSharpを今後も試してみようと考えています。ありがとう。 –

+0

コンテナはSystem.Objectではなくサービスタイプ自体のインスタンスを必要とするため、必要なサービスタイプにキャストする必要があります。あなたがしなければならないのは、サービスタイプを使用してプロキシを作成することです。すべて行くように設定する必要があります – plaureano

答えて

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 

編集:それは今公共のクラスの代わりに、LinFuで内部クラスになるように、私はちょうどProxyInjectorクラスを変更しました。それを試してみて、それが役に立ったら教えてください。

+0

こんにちは、私に戻ってくれてありがとう。私はGitHubから最新のものを取り出し、私が使っているものを解決しようとしています。私は今までコアアセンブリを使用してきましたが、ビルドスクリプトは多くの異なるアセンブリを作成しました。私が今必要なものをつなぎ合わせるだけで、そのコードを試してみましょう。 –

+0

ILMergeがインストールされている場合は、コマンドラインに「go merge」と入力すると、必要なすべての依存関係を持つ1つのアセンブリが得られます。 HTH :) – plaureano

+0

LinFuビルを取得するために管理(私はILMergeが不足しているようです)。コードを追加して、元の質問を編集したコードを更新する必要があります。 –

関連する問題