什么是 NInjects 等同于 TryAdd
What is NInjects equivalent of TryAdd
在其他DI容器中,我观察到TryAddScoped、TryAddTransient、TryAddSingleton等
Try 背后的想法是避免多次注册。如果服务已经注册,那么我猜使用 Try 将不会尝试再次注册。
随着注入
Kernel.Bind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();
那么 Ninject 中是否有等效的 Try?
没有简单的等价物。
表演
Kernel.Bind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();
Kernel.Bind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();
解析 IHttpContextAccessor
时会导致异常,解析 IEnumerable<IHttpContextAccessor>
时会 return 两个 HttpContextAccessor
实例。
但是,您可以自己编写 "Try":
检查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
而不是 .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>();
}
在其他DI容器中,我观察到TryAddScoped、TryAddTransient、TryAddSingleton等
Try 背后的想法是避免多次注册。如果服务已经注册,那么我猜使用 Try 将不会尝试再次注册。
随着注入
Kernel.Bind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();
那么 Ninject 中是否有等效的 Try?
没有简单的等价物。
表演
Kernel.Bind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();
Kernel.Bind<IHttpContextAccessor>().To<HttpContextAccessor>().InSingletonScope();
解析 IHttpContextAccessor
时会导致异常,解析 IEnumerable<IHttpContextAccessor>
时会 return 两个 HttpContextAccessor
实例。
但是,您可以自己编写 "Try":
检查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
而不是 .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>();
}