Простого эквивалента нет.
Выполнение
Kernel.Bind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();
Kernel.Bind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();
приведет к исключению при разрешении IHttpContextAccessor
, а при разрешении IEnumerable<IHttpContextAccessor>
вернет два HttpContextAccessor
экземпляры.
Однако вы можете написать свою собственную «Попробовать»:
Проверка того, существует ли Binding уже
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
Один из способов обойти проблему - использовать .Rebind
вместо .Bind
.Если предварительно не существует привязки, она будет работать так же, как .Bind
.И если есть уже существующая привязка, она заменит ее.Таким образом:
Kernel.Rebind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();
Kernel.Rebind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();
Разрешение IHttpContextAccessor
приведет к одному экземпляру HttpContextAccessor
.
Предотвращение загрузки дублирующихся модулей
В случае, если проблема не в нескольких компонентах/ NinjectModule
s создавая привязки для одного и того же типа, но вместо двухкратной загрузки одного и того же NinjectModule
, вы можете предотвратить повторяющуюся загрузку:
if(!Kernel.HasModule(typeof(MyModule)))
{
Kernel.Load<MyModule>();
}