【发布时间】:2011-03-23 00:33:14
【问题描述】:
我正在使用 Model 类上的 DataAnnotation 属性进行验证,并且 Model 类用于在应用程序的客户端和服务器端进行验证。
我的问题是,我不知道如何在不引起循环引用的情况下延迟加载模型的属性
涉及的库有:
- WCF 服务库
- 客户端数据访问库
- 模型库
因为模型库在客户端和服务器端都用于数据验证,所以我无法从模型库中引用 DataAccess 库。那么,如何设置延迟加载呢?
例如,我有一个 ConsumerModel,它有一个 PhoneNumbers 属性,应该延迟加载。如何在不引用客户端 DAL 的情况下从 ConsumerModel 中加载 PhoneNumberModel?
客户端 DAL:
using MyModels;
public class ConsumerDataAccess
{
public ConsumerModel GetConsumerById(int id)
{
ConsumerDTO dto = WCFService.GetConsumer(id);
return new ConsumerModel(dto);
}
}
消费者模型:
public class ConsumerModel
{
public ObservableCollection<PhoneNumberModel> _phoneNumbers;
public ObservableCollection<PhoneNumberModel> PhoneNumbers
{
get
{
if (_phoneNumbers == null)
{
// Can't reference DataAccess Library since that would cause a Circular Reference
}
}
}
}
我可以通过哪些替代方法使这种架构发挥作用?
我更愿意使用模型进行验证,并使用客户端和服务器端的模型进行验证。我还希望继续使用 DataAnnotation 进行验证。
编辑
如果有人感兴趣,这是我根据 Lawrence Wenham 的回答得出的最终解决方案。我最终使用了委托而不是事件。
达尔:
public class ConsumerDataAccess
{
public ConsumerModel GetConsumerById(int id)
{
ConsumerDTO dto = WCFService.GetConsumer(id);
ConsumerModel rtnValue = new ConsumerModel(dto);
ConsumerModel.LazyLoadData = LazyLoadConsumerData;
return rtnValue;
}
}
private object LazyLoadConsumerData(string key, object args)
{
switch (key)
{
case "Phones":
return PhoneDataAccess.GetByConsumerId((int)args);
default:
return null;
}
}
模型库:
public class ConsumerModel
{
public delegate object LazyLoadDataDelegate(string id, object args);
public LazyLoadDataDelegate LazyLoadData { get; set; }
public ObservableCollection<PhoneNumberModel> _phoneNumbers;
public ObservableCollection<PhoneNumberModel> PhoneNumbers
{
get
{
if (_phoneNumbers == null && LazyLoadData != null)
{
_phoneNumbers = (ObservableCollection<PhoneNumberModel>)
LazyLoadData("Phones", ConsumerId);
}
return _phoneNumbers;
}
}
}
【问题讨论】:
标签: c# wcf architecture mvvm lazy-loading