1

Crosspost:https://orchard.codeplex.com/discussions/471475零星LifetimeScope發出

有時候,我得到這個錯誤:「對象不解決,嵌套的壽命可以,因爲它已經被設置爲不從這個LifetimeScope創建」 查詢某些內容項目時查詢

這是我的功能是建立項目:

 protected IEnumerable<ContentItem> GetResources(string[] productFilters, string[] topicFilters, string[] techLevelFilters) 
     {     
      var cacheKey = BuildCacheKey(productFilters, topicFilters, techLevelFilters); 
      var resourceItems = ContentManager.Query().ForType("Resource").ForVersion(VersionOptions.Published).List(); 

      if (productFilters != null && productFilters.Any()) 
      { 
       resourceItems = resourceItems.Where(r => productFilters.Contains(GetTaxonomyFieldValue(r, productTaxonomy))); 
      } 

      if (topicFilters != null && topicFilters.Any()) 
      { 
       resourceItems = resourceItems.Where(r => topicFilters.Contains(GetTaxonomyFieldValue(r, topicTaxonomy))); 
      } 

      if (techLevelFilters != null && techLevelFilters.Any()) 
      { 
       resourceItems = resourceItems.Where(r => techLevelFilters.Contains(GetTaxonomyFieldValue(r, techLevelTaxonomy))); 
      } 

      return _cacheManager.Get(cacheKey, ctx => 
      { 
       ctx.Monitor(_clock.When(TimeSpan.FromMinutes(CacheTime))); 
       return resourceItems; 
      }); 
     } 

這是調用上面的一個功能的一部分,這有時顯示錯誤:

  string[] newProductFilters = GetProductFilters(0); 
      if (newProductFilters != null && newProductFilters.Any()) 
      { 
       productFilters = productFilters.Concat(newProductFilters).ToArray(); 
      }  

      var resourceItems = GetResources(productFilters, topicFilters, techLevelFilters); 

它發生零星和我無法找到問題的原因。任何建議或信息將不勝感激。謝謝!

+0

完全不清楚你如何處理你的依賴關係。你如何注入他們?你是否直接使用生命時間表?你可以發佈更多的代碼,堆棧錯誤請跟蹤。 –

回答

3

我的猜測是你的resourceItems變量仍然是一個LINQ枚舉,它是從_cacheManager.Get lambda引用的。當lambda實際得到執行時,我懷疑它引用的對象已經被處置。我建議在lambda引用它之前執行enumerable。例如:

var finalResourceItems = resourceItems.ToList(); 

return _cacheManager.Get(cacheKey, ctx => 
{ 
    ctx.Monitor(_clock.When(TimeSpan.FromMinutes(CacheTime))); 
    return finalResourceItems; 
}); 
+1

我這麼認爲。但是我會像這樣寫http://pastebin.com/pXidWHs7。在Cache Get中包裝整個方法。 – mberacochea

+1

@martinbc這也行得通,只記得在這種情況下執行enumerable('return resourceItems.ToList();),因爲你仍然會得到同樣的問題 – flipchart

+1

是的,我忘記了包括那個,更正了pastebin http:/ /pastebin.com/JsJsSSQe – mberacochea