在Simple Injector中Ninject WhenInjectedInto等效

时间:2017-04-09 09:58:19

标签: c# comparison ninject 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 ) )

1 个答案:

答案 0 :(得分:2)

与此相当的Simple Injector是:

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,不可能根据消费者的服务类型制作绑定上下文;您将使用此实现类型,如果您真的根据服务类型进行注册,则必须查询&#39;实现类型,以查看它是否实现给定的接口。直接在服务类型上执行此操作可能会导致难以跟踪错误,如here所述。请注意,这个问题是通用的,适用于所有DI容器,不仅适用于Simple Injector。