什么是NInjects相当于TryAdd

问题描述 投票:0回答:1

在其他DI容器中,我观察过TryAddScoped,TryAddTransient,TryAddSingleton等。

Try背后的想法是避免多次注册。如果服务已经注册,那么使用Try将不会尝试再次注册我猜。

注入

Kernel.Bind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();

那么在Ninject中是否有任何类似的Try?

ninject
1个回答
3
投票

没有简单的等价物。

表演

Kernel.Bind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();
Kernel.Bind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();

在解析IHttpContextAccessor时将导致异常,并且当解析IEnumerable<IHttpContextAccessor>时,它将返回两个HttpContextAccessor实例。

但是,您可以编写自己的“尝试”:

检查绑定是否已存在

if(!Kernel.GetBindings(typeof(IHttpContextAccessor)).Any())
{
    Kernel.Bind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();
}

当然,您也可以为此编写自己的扩展方法:

public static class NinjectBindingExtensions
{
    public static void TryBind<T>(
        this IKernel kernel,
        Action<IBindingToSyntax<T>> configureBinding)
    {
        if (!kernel.GetBindings(typeof(T)).Any())
        {
            configureBinding(kernel.Bind<T>());
        }
    }
}

重新绑定

解决这个问题的一种方法是使用.Rebind而不是.Bind。如果没有预先存在的绑定,它将像.Bind一样工作。如果有预先存在的绑定,它将取代它。从而:

Kernel.Rebind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();
Kernel.Rebind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();

解决IHttpContextAccessor将导致HttpContextAccessor的一个实例。

防止重复模块加载

如果问题不是多个组件/ NinjectModules为相同类型创建绑定,而是加载相同的NinjectModule两次,您可以通过以下方式防止重复加载:

if(!Kernel.HasModule(typeof(MyModule)))
{
    Kernel.Load<MyModule>();
}
© www.soinside.com 2019 - 2024. All rights reserved.