2

現在、インターセプトされているクラスの1つのインスタンスごとに1つのインターセプターインスタンスを接続しようとすると、問題が発生します。

InterceptorRegistrationStrategyでアドバイスを作成し、カーネルからインターセプターを解決するようにコールバックを設定しています(インジェクションコンストラクターがあります)。InterceptorRegistrationStrategyにはカーネル自体への参照がないため、コールバックでインターセプターをインスタンス化することしかできないことに注意してください。

            IAdvice advice = this.AdviceFactory.Create(methodInfo);
            advice.Callback = ((context) => context.Kernel.Get<MyInterceptor>());
            this.AdviceRegistry.Register(advice);

メソッドごとにインターセプターのインスタンスを取得しています。

インターセプトされるタイプインスタンスごとに1つのインターセプターインスタンスを作成する方法はありますか?

Named Scopeについて考えていましたが、インターセプトされたタイプとインターセプターは相互に参照していません。

4

2 に答える 2

5

バインディングのすべてのインスタンスに対して、メソッドごとに1つのインターセプターが作成されるため、これは不可能です。

ただし、インターセプターで直接インターセプトコードを実行するのではなく、インターセプトを処理するクラスのインスタンスを取得することができます。

public class LazyCountInterceptor : SimpleInterceptor
{
    private readonly IKernel kernel;

    public LazyCountInterceptor(IKernel kernel)
    {
        this.kernel = kernel;
    }

    protected override void BeforeInvoke(IInvocation invocation)
    {
        this.GetIntercpetor(invocation).BeforeInvoke(invocation);
    }

    protected override void AfterInvoke(IInvocation invocation)
    {
        this.GetIntercpetor(invocation).AfterInvoke(invocation);
    }

    private CountInterceptorImplementation GetIntercpetor(IInvocation invocation)
    {
        return this.kernel.Get<CountInterceptorImplementation>(
            new Parameter("interceptionTarget", new WeakReference(invocation.Request.Target), true));                
    }
}

public class CountInterceptorImplementation
{
    public void BeforeInvoke(IInvocation invocation)
    {
    }

    public void AfterInvoke(IInvocation invocation)
    {
    }
}

kernel.Bind<CountInterceptorImplementation>().ToSelf()
      .InScope(ctx => ((WeakReference)ctx.Parameters.Single(p => p.Name == "interceptionTarget").GetValue(ctx, null)).Target);
于 2011-03-19T01:59:24.757 に答える
1

流暢なAPIを使用してインターセプトを構成しようとしましたか?

Bind<IInterceptor>().To<MyInterceptor>().InSingletonScope();
Bind<IService>().To<Service>().Intercept().With<IInterceptor>();

注意:Intercept()拡張方法はNinject.Extensions.Interception.Infrastructure.Language.ExtensionsForIBindingSyntax

于 2011-03-18T14:44:35.013 に答える