Что является NInjects эквивалентом TryAdd - PullRequest
0 голосов
/ 26 февраля 2019

В других DI-контейнерах я наблюдал TryAddScoped, TryAddTransient, TryAddSingleton и т. Д.

Идея, стоящая за Try, состоит в том, чтобы избежать многократной регистрации.Если служба уже зарегистрирована, то использование Try не будет пытаться зарегистрироваться снова.

С inject

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

Так есть ли какой-нибудь эквивалент Try в Ninject?

1 Ответ

0 голосов
/ 01 марта 2019

Простого эквивалента нет.

Выполнение

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>();
}
...