Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 26th, 2012  |  syntax: None  |  size: 2.66 KB  |  hits: 9  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. How can I use LazyLoading with WCF without causing circular references?
  2. using MyModels;
  3.  
  4. public class ConsumerDataAccess
  5. {
  6.     public ConsumerModel GetConsumerById(int id)
  7.     {
  8.         ConsumerDTO dto = WCFService.GetConsumer(id);
  9.         return new ConsumerModel(dto);
  10.     }
  11. }
  12.        
  13. public class ConsumerModel
  14. {
  15.     public ObservableCollection<PhoneNumberModel> _phoneNumbers;
  16.  
  17.     public ObservableCollection<PhoneNumberModel> PhoneNumbers
  18.     {
  19.         get
  20.         {
  21.             if (_phoneNumbers == null)
  22.             {
  23.                 // Can't reference DataAccess Library since that would cause a Circular Reference
  24.             }
  25.         }
  26.     }
  27. }
  28.        
  29. public class ConsumerDataAccess
  30. {
  31.     public ConsumerModel GetConsumerById(int id)
  32.     {
  33.         ConsumerDTO dto = WCFService.GetConsumer(id);
  34.         ConsumerModel rtnValue = new ConsumerModel(dto);
  35.         ConsumerModel.LazyLoadData = LazyLoadConsumerData;
  36.         return rtnValue;
  37.     }
  38. }
  39.  
  40. private object LazyLoadConsumerData(string key, object args)
  41. {
  42.     switch (key)
  43.     {
  44.         case "Phones":
  45.             return PhoneDataAccess.GetByConsumerId((int)args);
  46.         default:
  47.             return null;
  48.     }
  49. }
  50.        
  51. public class ConsumerModel
  52. {
  53.     public delegate object LazyLoadDataDelegate(string id, object args);
  54.     public LazyLoadDataDelegate LazyLoadData { get; set; }
  55.  
  56.     public ObservableCollection<PhoneNumberModel> _phoneNumbers;
  57.  
  58.     public ObservableCollection<PhoneNumberModel> PhoneNumbers
  59.     {
  60.         get
  61.         {
  62.             if (_phoneNumbers == null && LazyLoadData != null)
  63.             {
  64.                 _phoneNumbers = (ObservableCollection<PhoneNumberModel>)
  65.                         LazyLoadData("Phones", ConsumerId);
  66.             }
  67.             return _phoneNumbers;
  68.         }
  69.     }
  70. }
  71.        
  72. public class LazyLoadEventArgs: EventArgs
  73. {
  74.     public object Data { get; set; }
  75.  
  76.     public string PropertyName { get; set; }
  77.  
  78.     public int Key { get; set; }
  79. }
  80.        
  81. public event EventHandler<LazyLoadEventArgs> LazyLoadData;
  82.  
  83. public ObservableCollection<PhoneNumberModel> PhoneNumbers
  84. {
  85.     get
  86.     {
  87.         if (_phoneNumbers == null)
  88.         {
  89.             LazyLoadEventArgs args = new LazyLoadEventArgs {
  90.                 PropertyName = "PhoneNumbers",
  91.                 Key = this.Id
  92.             };
  93.             LazyLoadData(this, args);
  94.             if (args.Data != null)
  95.                this._phoneNumbers = args.Data as ObservableCollection<PhoneNumberModel>;
  96.         }
  97.         return _phoneNumbers;
  98.     }
  99. }
  100.        
  101. private void Model_HandleLazyLoadData(object sender, LazyLoadEventArgs e)
  102. {
  103.     switch (e.PropertyName)
  104.     {
  105.         case "PhoneNumbers":
  106.             e.Data = DAL.LoadPhoneNumbers(e.Key);
  107.             break;
  108.         ...
  109.     }
  110. }