ninject约定多个绑定构造函数注入

时间:2015-05-26 19:05:01

标签: c# ninject

所以我遇到了在构造函数中获取实现通用接口的所有类实例的问题

我正在使用

kernel.Bind(x => x.FromThisAssembly().SelectAllClasses()
                  .InheritedFrom(typeof(IRepository<>)).BindAllInterfaces());

当我要求特定的存储库时,我有一个测试通过

var booking = kernel.Get<BookingRepository>();
Assert.IsNotNull(booking);

但是我创建了一个带

的类
ICollection<IRepository<EntityBase>> repositories, 

其中entitybase是我所有实体都从中继承的抽象类,我没有得到任何回复和测试

var rep = kernel.GetAll<IRepository<EntityBase>>(); 
当我断言它包含使用.Any()

的东西时,

不包含任何内容

如果我手动添加映射

kernel.Bind<IRepository<EntityBase>>().To<BookingRepository>(); 

然后这将被注入到集合中并且可以工作但是我想在我创建新的存储库并且在应用程序启动时将它们绑定时记住添加映射的麻烦。

我是否可以使用

将所有存储库注入构造函数中
ICollection<IRepository<EntityBase>>

1 个答案:

答案 0 :(得分:0)

您必须创建自己的逻辑来定义要绑定的类型:

kernel.Bind(x => x.FromThisAssembly()
    .SelectAllClasses()
    .InheritedFrom(typeof(IRepository<>))
    .BindSelection(this.SelectDefaultInterfaceAndRepositoryBaseInterface));

private IEnumerable<Type> SelectDefaultInterfaceAndRepositoryBaseInterface(
    Type t,
    IEnumerable<Type> baseTypes)
{
    yield return baseTypes.Single(x => 
                                   x.IsGenericType
                                   && x.GetGenericTypeDefinition() == typeof(IRepository<>));

    yield return typeof(IRepository<EntityBase>);
}

我已经运行了代码和ItWorksTM(包括ICollection<IRepository<EntityBase>>的ctor-injection)