我正在使用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