【问题标题】:Problem with lazy loading implementation延迟加载实现的问题
【发布时间】:2010-12-23 16:50:45
【问题描述】:


我在我的程序中实现了延迟加载。它是通过代理类完成的,例如:

class Order
{
   public virtual IList<Item> Items {get; set;}
}

class OrderProxy
{
   public override IList<Item> Items 
   {
      get
      {
          if (base.Items == null)
              Items = GetItems(base.OrderID);
          return base.Items;
      }
      set { base.Items = value; }
   }
}

问题是,每当我实例化代理类时,甚至没有触及 Items 属性,它就会尝试加载 Items!
您可能知道,我想实例化代理类并将实例返回给 BLL 而不是域对象本身。

有什么问题?
.NET CLR 在实例化类时是否访问(读取)类中的属性?
还有其他方法吗?

谢谢

【问题讨论】:

  • 假设没有代码尝试在构造时设置到 Items 中,基类中的 Items 是自动实现的属性这一事实是否与此行为有关?
  • 没关系,只是在我自己的示例项目中尝试过,我的项目没有被实例化。但是,无论您是测试它的值还是在调试器中查看它,它都会获取。

标签: c# lazy-loading


【解决方案1】:

有时是调试器预览触发加载

【讨论】:

  • +1 好点。此行为可以通过工具 - 选项 - 调试 - 常规 - “启用属性评估和其他隐式函数调用”来控制
  • 谢谢,我想这就是答案
【解决方案2】:

有什么问题? .NET CLR 是否 访问(读取)类中的属性, 什么时候启动类?

没有。

要查看哪些代码正在访问该属性,只需在其中放置一个断点并查看堆栈跟踪窗口(调试菜单 - Windows - 调用堆栈)。

【讨论】:

    猜你喜欢
    • 2018-01-24
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2011-04-18
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多