【问题标题】:How to do lazy loading part of a middle layer business object?如何延迟加载中间层业务对象的一部分?
【发布时间】:2011-02-14 16:02:54
【问题描述】:

我想构建一个业务对象,例如员工类,但我知道 80% 的属性几乎不会被使用。所以我想知道如何在构造函数中创建具有重要属性的对象,并在需要时延迟加载大麦使用的对象(如果有的话)。

我正在使用带有 c# 的 asp.net。

【问题讨论】:

  • 您已经在使用 ORM 工具集了吗?其中许多支持延迟加载。
  • 不,我没有使用 ORM。我正在通过从构造函数调用 load() 方法来补充对象属性。我想消除加载无用的东西并仅在需要时加载这些属性

标签: c# asp.net lazy-loading business-objects


【解决方案1】:

如果您使用的是纯商务舱,请使用System.Lazy class

此类(.net v4 最低)允许您以线程安全的方式将容器的填充推迟到第一次调用:

public class TestLazy
{
    private Lazy<MyClass> m_lazyObj;


    public MyClass MyClassInstance
    {
        get { return m_lazyObj.Value; }
    }


    public TestLazy()
    {
        m_lazyObj = new Lazy<string>(() => DoTheHeavyJobToGetMyClassInstance);
    }
}

如果您使用的是 ORM,正如帖子中其他人所说,延迟加载可能由 ORM 引擎提供。

[编辑]:添加了代码示例

【讨论】:

    【解决方案2】:

    最明显的做法是,

    public Constructor(Object importantPropertyValue)
    {
        this.ImportantProperty = importantPropertyValue;
    }
    
    public Object ImportantProperty{get; private set;}
    
    
    private Object _unimportantProperty;
    
    public Object UnimportantProperty
    {
        Get
        {
            if(_unimportantProperty == null)
            {
                _unimportantProperty = FetchUnimportantPropertyValue() // how ever you load it
            }
    
            return _unimportantProperty;
        }
    

    【讨论】:

    • 你能详细说明一下吗?是否有代码 int eh 构造函数来获取默认设置的常用属性,并且 if(_unimportantProperty == null) 然后也设置其他属性...我不知道在您的示例中设置常用属性的位置/方式。
    • 查看修改后的示例代码。这个想法是在请求它们的值之前将不常用的属性保留为空值,在这种情况下,您检查它是否已加载,如果未加载,则加载并返回该值。
    • 员工类可以在构造函数中取一个参数,比如userName吗?然后把所有重要的数据都拉出来,不重要的东西留给以后用null?
    • 我不确定您是如何加载属性的,但总的来说应该可以!
    • 我通过 loadData() 调用一次性加载它们。获取数据读取器并将值分配给属性。
    【解决方案3】:

    假设您在这里谈论的是从数据库中延迟加载,那么您可以使用 Entity Framework 4.0 构建您的域对象,并免费获得延迟加载。

    【讨论】:

    • 如果我不使用任何 ORM 怎么办。只是简单的旧 .net 和一个数据库数据层来水合对象?
    • 那么您必须手动构建它,使用类似于@shadowfoxmi 答案中的代码。但是使用 ORM 有很大的好处,所以如果你不使用 ORM,你应该问自己的第一个问题是为什么不呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多