Simple Injector中的WhenInjectedInto相当于Ninject中的什么?(涉及IT技术)

3

映射到常量值。

例如,当您需要解析一个automapper 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
请查看文档。如果文档无法回答您的问题,请提供更多细节和上下文信息,以便我们更好地为您解答。 - Steven
1
谢谢。我完全错过了那部分。如果你把它写成答案,我可以标记为已解决。否则我可以删除它。 - Lorenzo
1个回答

3
简单注入器(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版本起,基于消费者的服务类型进行上下文绑定已经不可能了;您需要使用实现类型来进行绑定,如果您真的要基于服务类型进行注册,那么您将不得不“查询”实现类型以查看它是否实现了给定的接口。直接在服务类型上执行此操作可能会导致难以跟踪的错误,如此处所述。请注意,这个问题是普遍存在的,并且适用于所有DI容器,而不仅仅是Simple Injector。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接