具有简单注入器的等效 Ninject 代码
Equivalent Ninject code with Simple Injector
决定从 Ninject 切换到简单注入器,我遇到的一个问题是试图将此代码转换为等效的简单注入器:
var resolver = new SomeResolver(container);
container.Rebind(typeof(IHubConnectionContext<dynamic>))
.ToMethod(context =>
resolver.Resolve<IConnectionManager>().GetHubContext<PlanHub>().Clients
).WhenInjectedInto<PlanHubService>();
- 在Ninject中使用
Rebind
等同于在Simple Injector中使用Register
并将AllowOverridingRegistrations设置为true
。
Ninject中的WhenInjectedInto
等同于Simple Injector中RegisterConditional的使用。
- Ninject 中的
ToMethod
通常等同于在 Simple Injector 中使用 Register<T>(Func<T>)
,但与 RegisterConditional
结合使用时,您将不得不退回到创建 Registration
使用 Lifestyle.CreateRegistration<T>(Func<T>, Container)
.
因此,您可以将绑定重写为以下简单注入器代码:
container.RegisterConditional(
typeof(IHubConnectionContext<dynamic>),
Lifestyle.Transient.CreateRegistration(
() => container.GetInstance<IConnectionManager>().GetHubContext<PlanHub>().Clients,
container),
WhenInjectedInto<PlanHubService>);
其中 WhenInjectedInto<T>
是定义如下的自定义辅助方法:
private static bool WhenInjectedInto<T>(PredicateContext context) =>
typeof(T).IsAssignableFrom(context.Consumer.ImplementationType);
决定从 Ninject 切换到简单注入器,我遇到的一个问题是试图将此代码转换为等效的简单注入器:
var resolver = new SomeResolver(container);
container.Rebind(typeof(IHubConnectionContext<dynamic>))
.ToMethod(context =>
resolver.Resolve<IConnectionManager>().GetHubContext<PlanHub>().Clients
).WhenInjectedInto<PlanHubService>();
- 在Ninject中使用
Rebind
等同于在Simple Injector中使用Register
并将AllowOverridingRegistrations设置为true
。
Ninject中的 WhenInjectedInto
等同于Simple Injector中RegisterConditional的使用。- Ninject 中的
ToMethod
通常等同于在 Simple Injector 中使用Register<T>(Func<T>)
,但与RegisterConditional
结合使用时,您将不得不退回到创建Registration
使用Lifestyle.CreateRegistration<T>(Func<T>, Container)
.
因此,您可以将绑定重写为以下简单注入器代码:
container.RegisterConditional(
typeof(IHubConnectionContext<dynamic>),
Lifestyle.Transient.CreateRegistration(
() => container.GetInstance<IConnectionManager>().GetHubContext<PlanHub>().Clients,
container),
WhenInjectedInto<PlanHubService>);
其中 WhenInjectedInto<T>
是定义如下的自定义辅助方法:
private static bool WhenInjectedInto<T>(PredicateContext context) =>
typeof(T).IsAssignableFrom(context.Consumer.ImplementationType);