与此问题类似: C#Constructor Design但这个问题略有不同.
我有一个Customer类和一个CustomerManager类.当创建CustomerManager类的实例时,我想加载所有客户.这就是我陷入困境的地方.我可以通过以下几种方式做到:
在执行数据库相关操作的CustomerManager类的每个方法中,检查加载的本地客户列表,如果没有,请加载列表:
public method FindCustomer(int id)
{
if(_customers == null)
// some code which will load the customers list
}
Run Code Online (Sandbox Code Playgroud)创建一个加载所有客户的方法.必须在调用执行数据库相关操作的方法之前调用此方法:
在课堂里:
public LoadData()
{
// some code which will load the customers list
}
Run Code Online (Sandbox Code Playgroud)
形式如下:
CustomerManager manager = new CustomerManager();
manager.LoadData();
Customer customer = manager.FindCustomer(int id);
Run Code Online (Sandbox Code Playgroud)做这个的最好方式是什么?
编辑:
我觉得我在这里被误解了.也许是因为我不够清楚.在CustomerManager类中,我有几种方法取决于本地列表(_customers).所以,我的问题是,我应该在哪里填写该清单?
你所描述的是"延迟加载".
一个简单的方法是拥有这样的私有财产:
private Lixt<Customer> _customers;
private List<Customer> Customers
{
get
{
if(_customers == null)
_customers = LoadData();
return _customers;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,你在Customers
内部提到.客户将在第一次需要时加载,但不会更早.
这是一种常见的模式,.Net 4.0添加了一个Lazy<T>
为您执行此操作的类.
在这种情况下,您只需将其定义为私有,如下所示:
private Lazy<List<Customer>> _customers = new Lazy<List<Customer>>(LoadData);
Run Code Online (Sandbox Code Playgroud)
然后,您只需在代码中引用您的客户:
_customers.Value
Run Code Online (Sandbox Code Playgroud)
该类将使用您的LoadData()
方法初始化该值.
如果您还没有使用.Net 4.0,那么Lazy<T>
该类很容易实现.
归档时间: |
|
查看次数: |
729 次 |
最近记录: |