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

ninject conventions multiple binding constructor injection

所以我在获取实现通用接口的所有 classes 实例时遇到问题,以便在我的构造函数中通过

我正在使用

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

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

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

但我创建了一个需要

的 class
ICollection<IRepository<EntityBase>> repositories, 

其中 entitybase 是一个抽象 class,我所有的实体都继承自它,我没有得到任何返回和测试

var rep = kernel.GetAll<IRepository<EntityBase>>(); 

当我使用 .Any()

断言它包含某些内容时,它不包含任何内容

如果我手动添加映射

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

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

我能否使用

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

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

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 注入)