Ninject WhenInjectedInto 等效于简单注入器
Ninject WhenInjectedInto equivalent in Simple Injector
映射到常数值。
例如,当您需要解析自动映射器 IMapper 实例时,就会发生这种情况,Ninject 中的示例将是
var config = new MapperConfiguration( cfg => {
cfg.AddProfile( new MyMapperConfiguration() );
} );
Bind<MapperConfiguration>().ToConstant( config ).InSingletonScope();
Bind<IMapper>().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<ICardValidator>().To<TypeAValidator>().WhenInjectedInto( typeof( ITypeACardService ) )
Bind<ICardValidator>().To<TypeBValidator>().WhenInjectedInto( typeof( ITypeBCardService ) )
与此等效的简单注入器是:
container.RegisterConditional<ICardValidator, TypeAValidator>(
c => c.Consumer.ImplementationType == typeof(TypeACardService));
container.RegisterConditional<ICardValidator, TypeBValidator>(
c => c.Consumer.ImplementationType == typeof(TypeBCardService));
如果你做一个简单的辅助方法,你甚至可以模仿 Ninject API 多一点:
// Helper method:
private static bool WhenInjectedInto<TImplementation>(PredicateContext c) =>
c => c.Consumer.ImplementationType == typeof(TImplementation);
// Registrations
c.RegisterConditional<ICardValidator, TypeAValidator>(WhenInjectedInto<TypeACardService>);
c.RegisterConditional<ICardValidator, TypeBValidator>(WhenInjectedInto<TypeBCardService>);
请注意,自 Simple Injector v4 以来,不可能根据消费者的服务类型进行绑定;您将为此使用实现类型,如果您真的根据服务类型进行注册,则必须 'query' 实现类型以查看它是否实现了给定的接口。如 here 所述,直接对服务类型执行此操作会导致难以跟踪错误。请注意,这个问题是普遍存在的并且适用于所有 DI 容器,而不仅仅是简单注入器。
映射到常数值。
例如,当您需要解析自动映射器 IMapper 实例时,就会发生这种情况,Ninject 中的示例将是
var config = new MapperConfiguration( cfg => {
cfg.AddProfile( new MyMapperConfiguration() );
} );
Bind<MapperConfiguration>().ToConstant( config ).InSingletonScope();
Bind<IMapper>().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<ICardValidator>().To<TypeAValidator>().WhenInjectedInto( typeof( ITypeACardService ) )
Bind<ICardValidator>().To<TypeBValidator>().WhenInjectedInto( typeof( ITypeBCardService ) )
与此等效的简单注入器是:
container.RegisterConditional<ICardValidator, TypeAValidator>(
c => c.Consumer.ImplementationType == typeof(TypeACardService));
container.RegisterConditional<ICardValidator, TypeBValidator>(
c => c.Consumer.ImplementationType == typeof(TypeBCardService));
如果你做一个简单的辅助方法,你甚至可以模仿 Ninject API 多一点:
// Helper method:
private static bool WhenInjectedInto<TImplementation>(PredicateContext c) =>
c => c.Consumer.ImplementationType == typeof(TImplementation);
// Registrations
c.RegisterConditional<ICardValidator, TypeAValidator>(WhenInjectedInto<TypeACardService>);
c.RegisterConditional<ICardValidator, TypeBValidator>(WhenInjectedInto<TypeBCardService>);
请注意,自 Simple Injector v4 以来,不可能根据消费者的服务类型进行绑定;您将为此使用实现类型,如果您真的根据服务类型进行注册,则必须 'query' 实现类型以查看它是否实现了给定的接口。如 here 所述,直接对服务类型执行此操作会导致难以跟踪错误。请注意,这个问题是普遍存在的并且适用于所有 DI 容器,而不仅仅是简单注入器。