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
.
我正在尝试像这样将 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
.