Domanda

Al momento sto riscontrando un problema, sto cercando di collegare esattamente un'istanza di intercettore per ogni istanza di classe che viene intercettata.

Sto creando un consiglio in InterceptorRegistrationStrategy e impostando il callback per risolvere un intercettore dal kernel (ha un costruttore di iniezione).Tieni presente che posso solo istanziare l'interceptor nel callback perché InterceptorRegistrationStrategy non ha riferimenti al kernel stesso.

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

Ricevo un'istanza di interceptor per metodo.

Esiste un modo per creare un'istanza dell'interceptor per tipo di istanza intercettata?

Stavo pensando a Named Scope, ma il tipo intercettato e l'interceptor non si riferiscono a vicenda.

È stato utile?

Soluzione

Non è possibile in quanto viene creato un unico intercettore per metodo per tutte le istanze di un'associazione.

Ma quello che puoi fare non è eseguire il codice di intercettazione direttamente nell'interceptor, ma ottenere un'istanza di una classe che gestirà l'intercettazione.

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

Altri suggerimenti

Hai provato a utilizzare l'API fluente per configurare la tua intercettazione?

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

N.B.Il metodo di estensione Intercept() è in Ninject.Extensions.Interception.Infrastructure.Language.ExtensionsForIBindingSyntax

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top