我希望拦截实现某个接口或具有某个属性的实例的创建。我能够做一些类似于拦截扩展的东西,但这似乎只是做方法和属性拦截。
这是我如何拦截方法和属性调用,但它不拦截构造函数调用:
_kernel.Bind<IInterceptor>().To<LogInterceptor>().InSingletonScope();
_kernel.Intercept(x =>
{
if (x.Plan.Type.GetInterface(typeof(ITriggerLoggingInterception).FullName) != null)
{
return true;
}
return false;
}).With<LogInterceptor>();
答案 0 :(得分:3)
正如你自己发现的那样,最接近于为每个绑定做实例的事情 - 不需要修改绑定 - 是IActivationStrategy。
例如(取自here的例子:
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的管道。