1

交叉邮件: https ://orchard.codeplex.com/discussions/471475

有时,我会收到此错误: “无法解析实例,并且无法从此 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);

它偶尔发生,我无法真正找到问题的原因。任何建议或信息将不胜感激。谢谢!

4

1 回答 1

3

我的猜测是您的resourceItems变量仍然是从_cacheManager.Getlambda 引用的 LINQ 可枚举。当该 lambda 实际执行时,我怀疑它所指的对象已经被释放。我建议在 lambda 中引用它之前执行可枚举。就像是:

var finalResourceItems = resourceItems.ToList();

return _cacheManager.Get(cacheKey, ctx =>
{
    ctx.Monitor(_clock.When(TimeSpan.FromMinutes(CacheTime)));
    return finalResourceItems;
});
于 2013-11-29T10:10:36.090 回答