Pregunta

Actualmente tengo un problema, intento conectar exactamente una instancia de interceptor por cada instancia de clase que se está interceptando.

Estoy creando un consejo en InterceptorRegistrationStrategy y estableciendo la devolución de llamada para resolver un interceptor del kernel (tiene un constructor de inyección).Tenga en cuenta que solo puedo crear una instancia de interceptor en la devolución de llamada porque InterceptorRegistrationStrategy no tiene referencia al Kernel en sí.

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

Obtengo una instancia de interceptor por método.

¿Hay alguna forma de crear una instancia de interceptor por cada instancia de tipo que se intercepta?

Estaba pensando en Named Scope, pero el tipo interceptado y el interceptor no hacen referencia entre sí.

¿Fue útil?

Solución

Eso no es posible ya que se crea un solo interceptor por método para todas las instancias de un enlace.

Pero lo que puede hacer no es ejecutar el código de intercepción directamente en el interceptor, sino obtener una instancia de una clase que manejará la intercepción.

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

Otros consejos

¿Ha intentado utilizar la API fluida para configurar su interceptación?

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

N.B.El método de extensión Intercept() está en Ninject.Extensions.Interception.Infrastructure.Language.ExtensionsForIBindingSyntax

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top