2011-03-22 5 views
0

현재 응용 프로그램에 mongodb-csharp 드라이버를 사용하고 있습니다.람다를 호출하여 요청한 항목을 모두 열고 일반 형식을 닫습니다.

내 저장소가 IMongoCollection<T>에 의존하기를 바라고 있습니다. 요청시 람다를 호출하도록 StructureMap을 구성하는 방법을 알아 내려고하고 있습니다. 비 개방형 제네릭 형식의 경우,이 같은 그것을 설정을 가지고 :

For<IMongoDatabase>() 
      .HybridHttpOrThreadLocalScoped() 
      .Use(cx => 
        { 
         var mongo = cx.GetInstance<IMongo>(); 
         return mongo.GetDatabase("TestDB"); 
        }); 

내가 열린 제네릭 위의 같은 것을 할 StructureMap를 구성하고 싶은, 그러나 나는 종류를 얻을하는 방법을 잘 모르겠어요 요청한 :

For(typeof (IMongoCollection<>)) 
      .HybridHttpOrThreadLocalScoped() 
      .Use(cx => 
        { 
         var db = cx.GetInstance<IMongoDatabase>(); 
         // How do I figure out what to close the generic with? 
         return db.GetCollection<T>(); 
        }); 

StructureMap에서 가능한가요? 여기 뭔가가 빠진 것처럼 느껴집니다 ...

답변

3

불행히도 요청한 유형을 결정하는 완전히 신뢰할 수있는 방법이 없습니다. 나는 이것이 StructureMap 3.0까지 수정 될 것이라고 상상하지 못한다. 그러나 cx.BuildStack.Root.RequestedType (또는 BuildStack의 다른 프레임 - 항상 루트는 아님)을 살펴보면 찾을 수 있습니다. 나는 그 접근법에 큰 행운이 없었지만, 실험 해 볼 가치가 있습니다.

귀하의 시나리오에서는 고객에게 IMongDatabase을 수락하고 GetCollection이라고 부르게합니다. IOC를 통해 "데이터"(형태 : IMongCollection)를 주입하는 것이 약간 이상합니다.

+0

당신이 제안한대로'IMongoDatabase'를 주입했습니다. 모든 메소드를 동일한'var collection = _mongoDatabase.GetCollection ();으로 시작하는 것이 이상하게 보였습니다. 컬렉션을 삽입하는 것은 조금 이상합니다. –

관련 문제