1

올리지 발행 : 때때로 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 변수는 여전히 _cacheManager.Get 람다에서 참조되는 LINQ 열거 가능 변수입니다. 그 람다가 실제로 실행되면, 나는 그것이 가리키는 객체가 이미 삭제 된 것으로 의심한다. 람다에서 참조하기 전에 enumerable을 실행하는 것이 좋습니다. 다음과 같음 :

var finalResourceItems = resourceItems.ToList(); 

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

나는 그렇게 생각한다. 하지만이 http://pastebin.com/pXidWHs7처럼 쓸 것입니다. 캐시 내부에 전체 메소드 래핑. – mberacochea

+1

@martinbc 그럴 수도 있습니다. 그 경우에도 마찬가지로 열거 형을 실행하는 것을 기억하십시오. ('return resourceItems.ToList();) 여전히 동일한 문제가 발생합니다. – flipchart

+1

예, 포함 된 것을 잊어 버렸습니다. /pastebin.com/JsJsSSQe – mberacochea