正如您自己发现的那样,最接近于对每个绑定进行实例化的操作(无需更改绑定)是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)创建绑定,则可以使用 anIBindingGenerator
相应地创建绑定(无论是否调用RegisterEvents
)。如果没有,那就更棘手了。我会说你必须扩展ninject的管道。