我期待拦截实现某个接口,还是有一定的属性实例的创建。 我可以做类似的东西与拦截扩展,但仅似乎做方法和属性拦截。
这里是我可以拦截方法和属性的调用,但它不会拦截构造函数调用:
_kernel.Bind<IInterceptor>().To<LogInterceptor>().InSingletonScope();
_kernel.Intercept(x =>
{
if (x.Plan.Type.GetInterface(typeof(ITriggerLoggingInterception).FullName) != null)
{
return true;
}
return false;
}).With<LogInterceptor>();
当你发现自己,什么是最接近做的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的管道。