在Ninject拦截创建实例(Intercept creation of instances in

2019-10-21 15:08发布

我期待拦截实现某个接口,还是有一定的属性实例的创建。 我可以做类似的东西与拦截扩展,但仅似乎做方法和属性拦截。

这里是我可以拦截方法和属性的调用,但它不会拦截构造函数调用:

_kernel.Bind<IInterceptor>().To<LogInterceptor>().InSingletonScope();
_kernel.Intercept(x =>
{
    if (x.Plan.Type.GetInterface(typeof(ITriggerLoggingInterception).FullName) != null)
    {
        return true;
    }

    return false;
}).With<LogInterceptor>();

Answer 1:

当你发现自己,什么是最接近做的instanciation东西每个绑定-不需要绑定被改变-是IActivationStrategy 。

例如(取自例子在这里 :

public class StartableStrategy : ActivationStrategy
{
  public override void Activate(IContext context, InstanceReference reference)
  {
    reference.IfInstanceIs<IStartable>(x => x.Start());
  }

  public override void Deactivate(IContext context, InstanceReference reference)
  {
    reference.IfInstanceIs<IStartable>(x => x.Stop());
  }
}

它被添加到ninject内核方式如下:

kernel.Components.Add<IActivationStrategy, StartableActivationStrategy>();

另类 - 绑定语法糖

让我进入有关详细OnActivation()我在评论中提到的扩展:

    public static IBindingOnSyntax<T> RegisterEvents<T>(this IBindingOnSyntax<T> binding)
    {
        // todo check whether <T> implements the IHandle<> interface, if not throw exception
        return binding
            .OnActivation((ctx, instance) => ctx.Kernel.Get<EventAggregator>().Subscribe(instance));
    }

这你就手动使用的绑定:

kernel.Bind<FooViewModel>().ToSelf()
      .RegisterEvents()
      .InSingletonScope();

(该InSingletonScope()是不需要的-它只是表明您可以使用其他绑定扩展/功能如前)。

现在,我想你想“按照惯例”采用这种相当。 如果按照惯例(ninject.extensions.conventions)创建绑定,您可以使用IBindingGenerator创建相应的绑定(有或没有调用RegisterEvents )。 如果不是,它得到的棘手。 我说你不得不延长ninject的管道。



文章来源: Intercept creation of instances in Ninject