- How can I use LazyLoading with WCF without causing circular references?
- 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
- }
- }
- }
- }
- 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;
- }
- }
- }
- public class LazyLoadEventArgs: EventArgs
- {
- public object Data { get; set; }
- public string PropertyName { get; set; }
- public int Key { get; set; }
- }
- public event EventHandler<LazyLoadEventArgs> LazyLoadData;
- public ObservableCollection<PhoneNumberModel> PhoneNumbers
- {
- get
- {
- if (_phoneNumbers == null)
- {
- LazyLoadEventArgs args = new LazyLoadEventArgs {
- PropertyName = "PhoneNumbers",
- Key = this.Id
- };
- LazyLoadData(this, args);
- if (args.Data != null)
- this._phoneNumbers = args.Data as ObservableCollection<PhoneNumberModel>;
- }
- return _phoneNumbers;
- }
- }
- private void Model_HandleLazyLoadData(object sender, LazyLoadEventArgs e)
- {
- switch (e.PropertyName)
- {
- case "PhoneNumbers":
- e.Data = DAL.LoadPhoneNumbers(e.Key);
- break;
- ...
- }
- }