Ninject 绑定泛型和 Mongo

Ninject Binding With Generics and Mongo

我正在尝试像这样将 MongoCollection 注入我的存储库层。

Func<Type, string> namingStrategy = x => x.Name;
            Kernel.Bind(typeof(MongoCollection<>))
             .ToMethod(
              x => x.Kernel.Get<MongoDatabase>().GetCollection(x.Request.Target.Type, namingStrategy(x.Request.Target.Type)));

应该做的是,通过从我们的 MongoDatabase 对象获取集合对象,将每个 MongoCollection<> 绑定到它的实现。这 "kinda" 有效,但我收到此错误:

Unable to cast object of type 'MongoDB.Driver.MongoCollection`1[MongoDB.Driver.MongoCollection`1[Profile]]' to type 'MongoDB.Driver.MongoCollection`1[Profile]

注意它从中转换的类型是双泛型的。例如

MongoCollection<MongoCollection<Profile>>

我不确定它是如何从我编写的 ninject 代码中得到那么深的。

首先,当您仔细查看错误时,它表明您有一个

类型的对象(实例)
MongoCollection<MongoCollection<Profile>>

无法转换为

MongoCollection<Profile>

这向我们表明,这不是请求的问题,也不是 ninject 的问题 - 因为 ninject 想要 MongoCollection<Profile> 并尝试转换 ToMethod 到这种类型。但是你传递给 ToMethod return 的 Func 是 MongoCollection<MongoCollection<Profile>>。 但是为什么?

x.Request.Target.Type

MongoCollection<Profile>!现在 MongoDatabase.GetCollection 确实希望通过 Profile,所以这是错误的。 所以你要做的就是使用:

x.Request.Target.Type
    .GetGenericArguments()
    .Single();

相反。它将 return Profile.