Frage

Ich habe derzeit ein Problem und versuche, genau eine Interceptor-Instanz pro Instanz der Klasse abzufangen, die abgefangen wird.

Ich erstelle und berate in der InterceptorRegistrationStrategy und setze den Rückruf, um einen Interceptor aus dem Kernel aufzulösen (er hat einen Injection-Konstruktor).Bitte beachten Sie, dass ich Interceptor nur im Rückruf instanziieren kann, da InterceptorRegistrationStrategy keinen Verweis auf den Kernel selbst hat.

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

Ich erhalte eine Instanz von Interceptor pro Methode.

Gibt es eine Möglichkeit, eine Interceptor-Instanz pro Typ-Instanz zu erstellen, die abgefangen wird?

Ich habe über Named Scope nachgedacht, aber abgefangener Typ und Abfangjäger verweisen nicht aufeinander.

War es hilfreich?

Lösung

Dies ist nicht möglich, da pro Methode für alle Instanzen einer Bindung ein einziger Interceptor erstellt wird.

Sie können den Abfangcode jedoch nicht direkt im Abfangjäger ausführen, sondern eine Instanz einer Klasse abrufen, die das Abfangen übernimmt.

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);

Andere Tipps

Haben Sie versucht, Ihre Interception mithilfe der fließenden API zu konfigurieren?

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

N.B.Die Intercept()-Erweiterungsmethode befindet sich in Ninject.Extensions.Interception.Infrastructure.Language.ExtensionsForIBindingSyntax

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top