我目前遇到了一个问题,试图为每个被拦截的类实例连接一个拦截器实例。
我在InterceptorRegistrationStrategy中创建和建议并设置回调来解析内核中的拦截器(它有一个注入构造函数)。请注意,我只能在回调中实例化拦截器,因为InterceptorRegistrationStrategy没有引用内核本身。
IAdvice advice = this.AdviceFactory.Create(methodInfo);
advice.Callback = ((context) => context.Kernel.Get<MyInterceptor>());
this.AdviceRegistry.Register(advice);
我正在获取每个方法的拦截器实例。
有没有办法为每个被拦截的类型实例创建一个拦截器实例?
我在考虑命名范围,但截获的类型和拦截器不会互相引用。
答案 0 :(得分: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);
答案 1 :(得分:1)
您是否尝试过使用流畅的API来配置拦截?
Bind<IInterceptor>().To<MyInterceptor>().InSingletonScope();
Bind<IService>().To<Service>().Intercept().With<IInterceptor>();
N.B。 Intercept()
扩展方法位于Ninject.Extensions.Interception.Infrastructure.Language.ExtensionsForIBindingSyntax