我正在使用Model类上的DataAnnotation
属性进行验证,并且Model类用于在应用程序的Client和Server端进行验证。如何在不引起循环引用的情况下使用LazyLoading和WCF?
我的问题是,如何延迟加载我的模型的属性,而不会导致循环引用
所涉及的库我想不出有:
- WCF服务库
- 客户端数据访问图书馆
- 模型库
,因为这些模型天秤座ry在客户端和服务器端用于数据验证,我无法从模型库中引用DataAccess库。因此,我如何设置延迟加载?
例如,我有一个ConsumerModel,它具有PhoneNumbers属性,应该延迟加载。如何在不引用客户端DAL的情况下从ConsumerModel中加载PhoneNumberModels?
客户端DAL:
using MyModels;
public class ConsumerDataAccess
{
public ConsumerModel GetConsumerById(int id)
{
ConsumerDTO dto = WCFService.GetConsumer(id);
return new ConsumerModel(dto);
}
}
ConsumerModel:
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进行验证。
编辑
这是我根据劳伦斯·温汉姆的答案最终解决方案,如果有人有兴趣。我结束了使用委托而不是事件。
DAL:
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;
}
}
}
我不知道我明白......实际上调用DAL加载PhoneNumber数据的是什么? – Rachel 2011-03-21 20:08:45
查看编辑答案。 LazyLoadData的事件处理程序是调用DAL的事件处理程序。您需要找出识别要加载的数据的最佳方式;在我的例子中,我只是使用了某种字符串和'Key',但是可以使用枚举,将其与'if(sender is ConsumerModel)'等组合在一起。它会使DAL不在模型中。 – 2011-03-21 20:23:33
这不会给我一个循环引用问题吗?模型需要了解观察者库,观察者需要了解模型库。我最初的问题是我无法从模型库中引用DAL,因此我无法将这两者结合起来。 – Rachel 2011-03-22 12:40:05