【问题标题】:C# Where to load initial data in an object?C# 在哪里加载对象的初始数据?
【发布时间】:2010-11-17 11:12:48
【问题描述】:

类似于这个问题: C# Constructor Design 但这个问题略有不同。

我有一个类 Customer 和一个类 CustomerManager。当创建 CustomerManager 类的实例时,我想加载所有客户。这就是我卡住的地方。我可以通过多种方式做到这一点:

  1. 在构造函数中加载所有客户(我不喜欢这个,因为如果我有很多客户可能需要一段时间)
  2. 在执行数据库相关操作的 CustomerManager 类的每个方法中,检查本地客户列表是否已加载,如果没有,则加载该列表:

    public method FindCustomer(int id)
    {
      if(_customers == null)
      // some code which will load the customers list
    }
    
  3. 创建一个加载所有客户的方法。此方法必须在调用执行数据库相关操作的方法之前调用:

    在课堂上:

    public LoadData()
    {
       // some code which will load the customers list
    }
    

    形式:

    CustomerManager manager = new CustomerManager();
    manager.LoadData(); 
    Customer customer = manager.FindCustomer(int id);
    

最好的方法是什么?

编辑:

我觉得我在这里被误解了。也许是因为我不够清楚。在 CustomerManager 类中,我有几个方法取决于本地列表 (_customers)。那么,我的问题是,我应该在哪里填写该列表?

【问题讨论】:

  • 当您说“表单”时,我相信您是指 WebForm 还是 WinForm,这很重要;我会以不同的方式实现每一个,因为还涉及缓存。那么,您指的是哪一个?
  • 我认为您需要详细说明(在您的编辑之后)。不清楚为什么延迟加载在 CustomerManager 类中不起作用,只要将 _customers 更改为惰性 CustomersLazy<T> 并在内部引用 _customers.Value
  • 对不起,我没想到,我的错!

标签: c# winforms


【解决方案1】:

您所描述的是“延迟加载”。

一个简单的方法是拥有这样的私有财产:

private Lixt<Customer> _customers;
private List<Customer> Customers
{
  get
  {
    if(_customers == null)
      _customers = LoadData();
    return _customers;
  }
}

然后,您在内部引用Customers。客户将在第一次需要时加载,但不会更早。

这是一种常见的模式,以至于 .Net 4.0 添加了一个 Lazy&lt;T&gt; 类来为您执行此操作。

在这种情况下,您只需将其定义为这样的私有:

private Lazy<List<Customer>> _customers = new Lazy<List<Customer>>(LoadData);

然后,您只需在代码中引用您的客户:

_customers.Value

该类将使用您的 LoadData() 方法初始化该值。

如果您还没有使用 .Net 4.0,Lazy&lt;T&gt; 类很容易实现。

【讨论】:

  • 这不是我的意思,请看我的编辑。无论如何 +1 对于 Lazy 方法
  • 我想我很困惑。为什么不能在 CustomerManager 类中使用这种方法?
【解决方案2】:

使用属性访问客户。检查客户是否已加载。

【讨论】:

    【解决方案3】:

    嗯,这取决于。你所有的选择都有优点和缺点。

    选项 1 和 3 的好处是用户可以完全控制何时执行(冗长的)数据加载操作。选项 1 或 3 是否更好取决于创建 Manager 并稍后加载数据是否有意义。就个人而言,如果操作时间较长,我更喜欢单独的 LoadData 方法,但这可能是个人喜好问题。

    选项 2 的好处是,如果不需要,则不会加载数据。缺点是(冗长的)负载是第一次访问的副作用,这使您的程序“不太确定”。

    原则上,您提出的所有选项都是不错且有效的选择。这真的取决于您的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 2021-05-07
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多