2015-01-29 3 views
0

Я пытаюсь внедрить MongoCollection в свой слой репозитория.Ninject Binding With Generics and Mongo

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))); 

Что, что нужно сделать, это связать каждый MongoCollection <> для его реализации, получая объект коллекции от нашего объекта MongoDatabase. Это «своего рода» работает, но я получаю эту ошибку:

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

Обратите внимание на тип это литье из вдвое generic'd. например

MongoCollection<MongoCollection<Profile>> 

Я не уверен, как это получается из-за того, что я написал.

ответ

2

Прежде, когда вы внимательно посмотрите на ошибки, он утверждает, что у вас есть объект (экземпляр) типа

MongoCollection<MongoCollection<Profile>> 

, который не может быть преобразован в

MongoCollection<Profile> 

Это показывает нам, что это не проблема с запросом, и это не проблема с ninject - потому что ninject хочет MongoCollection<Profile> и пытается передать результат ToMethod этому типу. Но Func вы перешли к ToMethod, возвращает MongoCollection<MongoCollection<Profile>>. Но почему?

x.Request.Target.Type 

MongoCollection<Profile>! Теперь MongoDatabase.GetCollection действительно ожидает передачи Profile, так что это не так. Так что вы должны сделать, это использовать:

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

вместо этого. Он вернется Profile.