c# - Ninject WhenInjectedInto 等效于简单注入(inject)器

标签 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() );

根据注入(inject)类型绑定(bind)不同的实现

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

public interface ICardService  {}

public class TypeACardService : ICardService, ITypeACardService {

    public TypeACardService( ICardValidator validator ) {
    }
}

public class TypeBCardService : ICardService, ITypeBCardService {

    public TypeBCardService( ICardValidator validator ) {
    }
}

在这种情况下,使用 Ninject,我们能够根据要注入(inject)的类型注入(inject)不同的具体实现。示例

Bind<ICardValidator>().To<TypeAValidator>().WhenInjectedInto( typeof( ITypeACardService ) )
Bind<ICardValidator>().To<TypeBValidator>().WhenInjectedInto( typeof( ITypeBCardService ) )

最佳答案

与此等效的简单注入(inject)器是:

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 以来,不可能根据消费者的服务类型进行绑定(bind);您将为此使用实现类型,如果您确实根据服务类型进行注册,则必须“查询”实现类型以查看它是否实现了给定的接口(interface)。如 here 所述,直接对服务类型执行此操作会导致难以跟踪错误。 .请注意,这个问题是普遍存在的并且适用于所有 DI 容器,而不仅仅是简单注入(inject)器。

关于c# - Ninject WhenInjectedInto 等效于简单注入(inject)器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43305386/

相关文章:

c# - 如何获取使用 FileSystemWatcher 创建的新文件的名称?

c# - 需要apiversioning版本的asp net core中间件

c# - 如何使用asp.net(C#)注册新用户?

.net - .NET 4.0 中的 Array.Sort() 发生了什么? TrySZSort() 消失了吗?

dependency-injection - 如何使用 Ninject 实例化 MEF 导出的对象?

c# - 具有 Azure 辅助角色的 Ninject

c# - HttpWebRequest 中的 SSL 重新协商 (SEC_I_RENEGOTIATE) 问题并且没有保持事件状态

mysql - Oracle RDBMS 是否比 MySQL RDBMS 更稳定、更安全、更健壮等?

python - 如何有效地比较两个无序列表(不是集合)?

c# - 以非通用方式绑定(bind) Ninject Factory Extension 后出现异常