具有简单注入器的等效 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);