2

我目前遇到一个问题,试图为每个被拦截的类实例连接一个拦截器实例。

我在 InterceptorRegistrationStrategy 中创建和建议并设置回调以从内核解析拦截器(它有一个注入构造函数)。请注意,我只能在回调中实例化拦截器,因为 InterceptorRegistrationStrategy 没有对内核本身的引用。

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

我得到每个方法的拦截器实例。

有没有办法为每个被拦截的类型实例创建一个拦截器实例?

我在考虑命名范围,但拦截类型和拦截器不相互引用。

4

2 回答 2

5

这是不可能的,因为每个方法都会为绑定的所有实例创建一个拦截器。

但是你可以做的不是直接在拦截器中执行拦截代码,而是获取一个将处理拦截的类的实例。

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

您是否尝试过使用 fluent 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 回答