2013-01-16 28 views
1

我有三个项目Ninject绑定:绑定到不同类型的相同界面。为什么有效?

  • Application.Infrastructure
  • Application.A(具有Application.Infrastructure参考)
  • Application.B(具有Application.Infrastructure参考)
  • Application.Web(具有从所有参考)

Application.Infrastructure我有一个通用的仓库类

public interface IRepository<T> 
{ 
    T FirstOrDefault(Expression<Func<T, bool>> where); 
} 

Application.A我有这个库

public class ApplicationARepository<T> : IRepository<T> 
{ 
    private readonly IApplicationADBContext _context; 
    public ApplicationARepository(IApplicationADBContext context) 
    { 
     _context = context; 
    } 
    // implementation 
} 

的实现在Application.B我有储存库接口的另一实施

public class ApplicationBRepository<T> : IRepository<T> 
{ 
    private readonly IApplicationBDBContext _context; 
    public ApplicationBRepository(IApplicationBDBContext context) 
    { 
     _context = context; 
    } 
    // implementation 
} 

在Application.Web我结合使用Ninject

接口
// Bind implementations from Application.A 
kernel.Bind<IApplicationADBContext>().To<ApplicationADBContext>().InRequestScope(); 
kernel.Bind(typeof(IRepository<>)).To(typeof(ApplicationARepository<>)); 

// Bind implementations from Application.B 
kernel.Bind<IApplicationBDBContext>().To<ApplicationBDBContext>().InRequestScope(); 

// Here should fail. I already binded typeof(IRepository<>) to typeof(ApplicationARepository<>) 
kernel.Bind(typeof(IRepository<>)).To(typeof(ApplicationBRepository<>)); 

即使我将相同的接口绑定到两种不同的类型,但没有指定任何.Where()子句,它仍在工作,我不会收到任何错误。

为什么? Ninject如何知道如何区分它们?

+0

什么行代码你期望失败?第二个绑定或行,你尝试解析接口? –

+0

接口是不同的..'BDB'和'ADB' ... –

+0

第二次绑定时,我将相同的接口绑定到另一种类型 – Catalin

回答

0

将多个实现绑定到单个接口是绝对正确的。然后您可以让Ninject将其注入为IEnumerable。您甚至可以多次绑定一个实现。

例如:

// binding 
kernel.Bind<IService>().To<BasicService>(); 
kernel.Bind<IService>().To<BasicService>(); 

// injection 
private IEnumerable<IService> myServices; 

public NeedServices(IEnumerable<IService> myServices) 
{ 
    this.myServices = myServices; 
} 

,你会得到两个引用的集合BasicService

如果您尝试注入单个实现,则会出现错误的情况。当Ninject尝试解析依赖关系时(并且他不知道要选择哪个实现),错误将会增加。

public NeedService(IService myService) 
{ 
    this.myService = myService; 
} 

所以分辨率是Ninject并不检查依赖性可以在绑定的时间来解决,但在当时应该何时注入。

而且它完全是有意义的,因为对于某些类型的Contextual-Binding条件可能会随时间而改变(例如,如果您使用.When(x=> ItIsRightTimeToInjectAImplementation())

相关问题