在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。