Ninject 使用反射的依赖注入

Ninject Dependency Injection Using Reflection

public DefaultRepositoryRegistry(IKernel kernel)
{
    foreach (var tuple in DefaultContractList())
    {
        var iRepo = tuple.Item1;
        var repo = tuple.Item2;
    }
}

private static IEnumerable<Tuple<Type, Type>> DefaultContractList()
{
    var contractList = new List<Tuple<Type, Type>>()
    {
        #region Mongo

        Tuple.Create(typeof (IMongoRepository), typeof (MongoRepository)),

        #endregion Mongo
    };

    return contractList;
}

我无法进行动态绑定,例如

foreach (var tuple in DefaultContractList())
{
    var iRepo = tuple.Item1;
    var repo = tuple.Item2;

    kernel.Bind<iRepo>().To<repo>();
}

关于为什么 Ninject 不接受这种类型的绑定的任何帮助? 我这样做是为了让人们可以在不同的依赖注入框架中使用同一组服务。

此语法可能无法编译:

foreach (var tuple in DefaultContractList())
{
    var iRepo = tuple.Item1;
    var repo = tuple.Item2;

    kernel.Bind<iRepo>().To<repo>();
}

尖括号内的位称为类型参数(例如<iRepo><repo>),它们应该是实际的类型名称,而不是System.Type 类型的变量。不过,碰巧 Ninject 有另一种绑定形式,它可能非常适合您:

foreach (var tuple in DefaultContractList())
{
    var iRepo = tuple.Item1;
    var repo = tuple.Item2;

    kernel.Bind(iRepo).To(repo);
}