类似这个问题: C# Constructor Design但这个问题略有不同。
我有一个类 Customer 和一个类 CustomerManager。当创建 CustomerManager 类的实例时,我想加载所有客户。这就是我被困的地方。我可以通过几种方式做到这一点:
- 在构造函数中加载所有客户(我不喜欢这个,因为如果我有很多客户,它可能需要一段时间)
在执行数据库相关操作的 CustomerManager 类的每个方法中,检查本地客户列表是否已加载,如果没有,则加载列表:
public method FindCustomer(int id) { if(_customers == null) // some code which will load the customers list }
创建一个加载所有客户的方法。必须在调用执行数据库相关操作的方法之前调用此方法:
在类里面:
public LoadData() { // some code which will load the customers list }
形式:
CustomerManager manager = new CustomerManager(); manager.LoadData(); Customer customer = manager.FindCustomer(int id);
执行此操作的最佳方法是什么?
编辑:
我觉得我在这里被误解了。也许是因为我不够清楚。在 CustomerManager 类中,我有几个方法取决于本地列表 (_customers)。那么,我的问题是,我应该在哪里填写该列表?
最佳答案
您所描述的是“延迟加载”。
一个简单的方法是拥有这样的私有(private)属性:
private Lixt<Customer> _customers;
private List<Customer> Customers
{
get
{
if(_customers == null)
_customers = LoadData();
return _customers;
}
}
然后,你引用Customers
在内部。客户将在第一次需要时加载,但不会更早。
这是一个很常见的模式,以至于 .Net 4.0 添加了一个 Lazy<T>
为你做这件事的类。
在这种情况下,您只需像这样将其定义为私有(private):
private Lazy<List<Customer>> _customers = new Lazy<List<Customer>>(LoadData);
然后,您只需在代码中引用您的客户:
_customers.Value
该类将使用您的 LoadData()
初始化该值方法。
如果您还没有使用 .Net 4.0,Lazy<T>
类非常容易实现。
关于C# 在哪里加载对象中的初始数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4203777/