Ninject:按属性截取而不从InterceptAttribute派生

时间:2014-09-29 14:44:03

标签: c# dependency-injection attributes ninject aop

我正在寻找一种方法,使用Ninject基于某个属性将拦截器连接到方法调用。 Ninject提供了InterceptAttribute基类,这样做很整洁,但我希望用自定义属性来实现。原因是我想用业务相关的属性来装饰某些域服务接口,所以我不能将任何东西紧密地耦合到其中的框架中。

这可能吗?

1 个答案:

答案 0 :(得分:2)

您可以从InterceptorRegistrationStrategy派生并覆盖Execute(IPlan plan)方法(加上可能还有RegisterClassInterceptors)来使用您自己的属性类型而不是ninject的InterceptAttribute

然后,您需要将实现注册为内核组件:

this.Kernel.Components.Add<IPlanningStrategy, MyInterceptorRegistrationStrategy>();

您可能还必须了解InterceptorRegistrationStrategyAutoNotifyInterceptorRegistrationStrategyMethodInterceptorRegistrationStrategy的工作原理,以便您可以创建一个有效且无副作用的实现。 (这不会取代拦截扩展,而只是扩展它)。

还有一个stackoverflow答案,涵盖了可能有用的自定义策略:Ninject Intercept any method with certain attribute?

当然,您可以使用其他方法之一进行拦截:

  • 使用绑定,为整个类型定义拦截,如Bind<IFoo>().To<Foo>().Intercept().With<MyInterceptor>(),并让MyInterceptor检查是否应截取给定方法。
  • 使用convention API或自己编写类似的东西,搜索所有自定义拦截属性,然后使用以下语法:
Kernel.InterceptAround<CustomerService>(
    s=>s.GetAllCustomers(),
    invocation =>logger.Info("Retrieving all customers..."),
    invocation =>logger.Debug("Customers retrieved"));

(另见Interception with ninject