2011-03-22 74 views
0

我目前在我的應用程序中使用了mongodb-csharp驅動程序。通過調用lambda來關閉打開的任何類型的泛型類型

我想我的存儲庫取決於IMongoCollection<T>,我想弄清楚如何配置StructureMap讓我在請求時調用lambda。對於非開放式泛型類型,我把它設置是這樣的:

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

這是可能的結構圖?我覺得我在這裏失去了一些東西...

回答

3

不幸的是,沒有完全可靠的方式來確定所需的類型 - 我也遇到過一個限制。我不認爲它會被修復,直到StructureMap 3.0。 但是,您可以通過查看cx.BuildStack.Root.RequestedType(或BuildStack上的其他框架 - 並非始終是根目錄)來查找它。這種方法我沒有很好的運氣,但值得嘗試。

對於您的情況,我可能只是讓我的消費者接受IMongDatabase並自己撥打GetCollection。通過IOC注入「數據」(形式爲IMongCollection)感覺有點奇怪。

+0

我繼續按照你的建議注入'IMongoDatabase',看起來很奇怪我的方法全部用同樣的'var collection = _mongoDatabase.GetCollection ();''''''''''''''''我同意你的意見雖然,注入集合有點奇怪。 – 2011-03-23 14:19:38