开发应用-观察者模式之C#实现缓存数据更新
作者:C/S原创  发布日期:2011/03/22 21:35:27
  开发应用-观察者模式之C#实现缓存数据更新


开发应用-观察者模式之C#实现缓存数据更新


我们在开发大型基于数据库管理应用系统时,会用到大量的缓存数据,这样能提高软件系统的性能,使用缓存数据带来便利的同时,也会因为用户更新了原始数据,如增、删、改导致缓存数据不同步更新,变成了旧数据、脏数据!



如何能同步更新缓存数据呢?


我想大家都会遇到这个问题,特整理了一套方案仅供参考:


观察者模式(Observer Facade Pattern)


贴图图片





贴图图片





定义一组观察者,他们时刻监视用户对原始数据的操作。



贴图图片 





观察者模式接口








具体数据的业务逻辑层









/// <summary>
/// 观察者模式接口
/// </summary>
public interface IObserver
{
   //仅一个方法,通知(Notify)观察者接收到消息
   void Notify();
}

// 来源:www.CSFramework.com, C/S结构框架学习网





/// <summary>
/// 支持数据字典观察者的窗体,比如PO,PN等业务窗体
/// Lookup功能视为数据字典观察者
/// </summary>
public interface IObserverSupportable
{
   //获取观察者列表, 通常业务窗体内会对应多个数据字典表
   IList GetObservers();
}

// 来源:www.CSFramework.com, C/S结构框架学习网




 

/// <summary>
/// 数据字典窗体
/// </summary>
public interface IObserverDataDictForm
{
   //
   //注册观察者,当字典数据改变时通知所有观察者同步更新数据.
   //
   //一个数据字典可能会关联多个业务窗体.比如货币字典会在采购窗体和窗体内使用.
   //因此,当字典数据改变时要通知采购窗体和窗体刷新数据.
   //
   void RegisterObserver(IList observers);
}

// 来源:www.CSFramework.com, C/S结构框架学习网







public class ObserverAdd : IObserver
{
   private ListBox _Monitor;
   
   public ObserverAdd(ListBox monitor)
   {
      _Monitor = monitor;
   }
   
   public void Notify()
   {
      _Monitor.Items.Add("观察到新增记录!");
   }
}


// 来源:www.CSFramework.com, C/S结构框架学习网




public class ObserverDelete : IObserver
{
   private ListBox _Monitor;
   
   public ObserverDelete(ListBox monitor)
   {
      _Monitor = monitor;
   }
   
   public void Notify()
   {
      _Monitor.Items.Add("观察到删除记录!");
   }
}

// 来源:www.CSFramework.com, C/S结构框架学习网




/// <summary>
/// 同步刷新货币数据字典的观察者
/// </summary>
public class ObserverCurrency : IObserver
{
   private ComboBox _CurrencyData;
   private ListBox _log;
   
   public ObserverCurrency(ComboBox comboBox, ListBox log)
   {
      _CurrencyData = comboBox;
      _log = log;
   }
   
   public void Notify()
   {
      //模模拟从SQL Server取数据
      DataTable dt = new DataTable();
      dt.ReadXml(Application.StartupPath @"\data\currency.xml");
      
      _CurrencyData.DataSource = null;
      _CurrencyData.DisplayMember = "CurrencyCode";
      _CurrencyData.ValueMember = "CurrencyCode";
      _CurrencyData.DataSource = dt;//绑定数据源
      
      _log.Items.Add("客户窗体刚才通知了观察者!");
      _log.Items.Add("刷新数据完成! 共下载了 " dt.Rows.Count.ToString() " 条记录!");
   }
   
}

// 来源:www.CSFramework.com, C/S结构框架学习网




/// <summary>
/// 同步刷新客户数据字典的观察者
/// </summary>
public class ObserverCustomer : IObserver
{
   private ComboBox _CustomerData;
   private ListBox _log;
   
   public ObserverCustomer(ComboBox comboBox, ListBox log)
   {
      _CustomerData = comboBox;
      _log = log;
   }
   
   public void Notify()
   {
      //模模拟从SQL Server取数据
      DataTable dt = new DataTable();
      dt.ReadXml(Application.StartupPath @"\data\customer.xml");
      
      _CustomerData.DataSource = null;
      _CustomerData.DisplayMember = "CustomerCode";
      _CustomerData.ValueMember = "CustomerCode";
      _CustomerData.DataSource = dt;
      
      _log.Items.Add("客户窗体刚才通知了观察者!");
      _log.Items.Add("刷新数据完成! 共下载了 " dt.Rows.Count.ToString() " 条记录!");
   }
}

// 来源:www.CSFramework.com, C/S结构框架学习网




public class ObserverUnit : IObserver
{
   private ComboBox _UnitComboBox;
   
   public ObserverUnit(ComboBox box)
   {
      _UnitComboBox = box;
   }
   
   public void Notify()
   {
      //模模拟从SQL Server取数据
      DataTable dt = new DataTable();
      dt.ReadXml(Application.StartupPath @"\data\unit.xml");
      
      _UnitComboBox.DataSource = null;
      _UnitComboBox.DisplayMember = "UnitCode";
      _UnitComboBox.ValueMember = "UnitCode";
      _UnitComboBox.DataSource = dt;//绑定数据源
   }
}

// 来源:www.CSFramework.com, C/S结构框架学习网





/// <summary>
/// 货币资料业务逻辑
///
///
/// </summary>
public class CurrencyData
{
   private DataTable _Data; //货币数据,缓存数据
   private IList _Observers = new ArrayList();//货币资料的观察者(1...n)
   
   private string _xml = Application.StartupPath @"\data\currency.xml";
   
   
   public DataTable DataSource { get { return _Data; } }
   
   public void CreateTable()
   {
      _Data = new DataTable("Currency");
      
      if (File.Exists(_xml))
      _Data.ReadXml(_xml);
      else
      {
         _Data.Columns.Add("CurrencyCode", typeof(string));
      }
   }
   
   public void AddCurrency(string code)
   {
      _Data.LoadDataRow(new object[] { code }, true);
      _Data.AcceptChanges(); //更新缓存的数据
      _Data.WriteXml(_xml, XmlWriteMode.WriteSchema);//保存到文件
      
      this.NotifyObservers();//通知所有观察者刷新数据
   }
   
   public void DeleteCurrency(string code)
   {
      DataRow[] rows = _Data.Select("CurrencyCode='" code "'");
      if (rows.Length > 0) rows[0].Delete();
      _Data.AcceptChanges();//更新缓存的数据
      _Data.WriteXml(_xml, XmlWriteMode.WriteSchema); //保存到文件
      
      this.NotifyObservers();//通知所有观察者刷新数据
   }
   
   /// <summary>
   /// 通知所有观察者
   /// </summary>
   private void NotifyObservers()
   {
      foreach (IObserver o in _Observers) o.Notify();
   }
   
   /// <summary>
   /// 登记观察者
   /// </summary>
   /// <param name="observers">观察者列表(1..n)</param>
   public void RegisterObserver(IList observers)
   {
      foreach (IObserver o in observers)
      {
         //if (o is ObserverCurrency) _Observers.Add(o);
         
         _Observers.Add(o);
      }
   }
}

// 来源:www.CSFramework.com, C/S结构框架学习网




C/S框架网|原创精神.创造价值.打造精品

扫一扫加微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务


点击下载附件 点击下载附件 (如下载失败,请邮件通知我们寄回给您,或QQ:23404761留言.)
上一篇 下一篇