在Simple Injector中Ninject WhenInjectedInto等效

映射到常量值。

例如,当您需要解析一个automapper IMapper实例时会发生这种情况,例如Ninject中的示例

var config = new MapperConfiguration( cfg => { cfg.AddProfile( new MyMapperConfiguration() ); } ); Bind().ToConstant( config ).InSingletonScope(); Bind().ToConstant( config.CreateMapper() ); 

根据注入类型绑定不同的实现

当一组公共类依赖于公共接口但具体实现应该不同时,就会发生这种情况。 例

 public interface ICardService {} public class TypeACardService : ICardService, ITypeACardService { public TypeACardService( ICardValidator validator ) { } } public class TypeBCardService : ICardService, ITypeBCardService { public TypeBCardService( ICardValidator validator ) { } } 

在这种情况下,使用Ninject,我们可以根据我们注入的类型注入不同的具体实现。 例

 Bind().To().WhenInjectedInto( typeof( ITypeACardService ) ) Bind().To().WhenInjectedInto( typeof( ITypeBCardService ) ) 

与此相当的Simple Injector是:

 container.RegisterConditional( c => c.Consumer.ImplementationType == typeof(TypeACardService)); container.RegisterConditional( c => c.Consumer.ImplementationType == typeof(TypeBCardService)); 

如果你做一个简单的辅助方法,你甚至可以更多地模仿Ninject API:

 // Helper method: private static bool WhenInjectedInto(PredicateContext c) => c => c.Consumer.ImplementationType == typeof(TImplementation); // Registrations c.RegisterConditional(WhenInjectedInto); c.RegisterConditional(WhenInjectedInto); 

请注意,由于Simple Injector v4, 不可能根据使用者的服务类型制作绑定上下文; 您将使用此实现类型,如果您真的根据服务类型进行注册,则必须“查询”实现类型以查看它是否实现了给定的接口。 直接在服务类型上执行此操作可能导致难以跟踪错误,如此处所述。 请注意,这个问题是通用的,适用于所有DI容器,不仅适用于Simple Injector。