gpt4 book ai didi

c# - 在 Ninject 中拦截实例的创建

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:22 24 4
gpt4 key购买 nike

我希望拦截实现特定接口(interface)或具有特定属性的实例的创建。我可以用拦截扩展做一些类似的事情,但这似乎只做方法和属性拦截。

这是我如何拦截方法和属性调用,但它不拦截构造函数调用:

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

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

最佳答案

正如您自己发现的那样,最接近于对每个绑定(bind)的实例化做某事 - 不需要更改绑定(bind) - 是 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>();

备选 - 绑定(bind)语法糖

让我更详细地了解我在评论中提到的 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));
}

您将手动使用绑定(bind):

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

(不需要 InSingletonScope() - 它只是为了表明您可以像以前一样使用其他绑定(bind)扩展/功能)。

现在我认为您想使用这个而不是“按照惯例”。如果您按照约定 (ninject.extensions.conventions) 创建绑定(bind),则可以使用 IBindingGenerator 相应地创建绑定(bind)(调用或不调用 RegisterEvents)。如果没有,它会变得更加棘手。我会说你必须扩展 ninject 的管道。

关于c# - 在 Ninject 中拦截实例的创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27949636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com