使用观察者模式实时更新程序打开多个界面绑定组件的数据源
作者:C/S框架网|www.cscode.ne  发布日期:2019/10/18 20:43:26
  使用观察者模式实时更新程序打开多个界面绑定组件的数据源


使用观察者模式(Observer Pattern),实时更新当前程序打开多个界面的绑定组件的数据源。

实例截图参考:

贴图图片-微信截图_20191018202236


贴图图片-微信截图_20191018202332


贴图图片-微信截图_20191018202440




观察者接口设计:

C# Code:

public interface IObserver
{
   string Name { get; }
   
   void Notify();
}


观察者实例1:

C# Code:

/// <summary>
/// 产品成本明细表的成本项目Lookup组件观察者
/// </summary>
public class ProductCostParamObserver : IObserver
{
   protected string _TableName = "";
   protected object _ObservedData;
   private RepositoryItemLookUpEdit _LookUpEdit;
   private bool _ReloadDataSource = false;//调用通知事件时是否重新加载数据源
   
   public ProductCostParamObserver(string tableName,
   RepositoryItemLookUpEdit lookupEdit, bool reloadDataSource = false)
   {
      _TableName = tableName;
      _LookUpEdit = lookupEdit;
      _ReloadDataSource = reloadDataSource;
      
      this.Notify();
   }
   
   public string Name { get { return _TableName; } }
   
   public virtual void Notify()
   {
      if (_ReloadDataSource)
      DataDictCache.Cache.RemoveCache(_TableName);
      
      //绑定组件的数据源
      DataBinderTools.BoundProductCostParam(_LookUpEdit);
   }
}

//来源:C/S框架网(www.csframework.com) QQ:23404761


观察者实例2:

C# Code:


/// <summary>
/// 产品类别下拉选择组件观察者
/// </summary>
public class ProductCategoryObserver : IObserver
{
   protected string _TableName = "";
   protected object _ObservedData;
   private TreeListLookUpEdit _LookUpEdit;
   private ImageList _ImageList;
   private bool _ReloadDataSource = false;//调用通知事件时是否重新加载数据源
   
   public ProductCategoryObserver(string tableName,
   TreeListLookUpEdit lookupEdit, ImageList imageList, bool reloadDataSource = false)
   {
      _ReloadDataSource = reloadDataSource;
      _TableName = tableName;
      _LookUpEdit = lookupEdit;
      _ImageList = imageList;
      
      this.Notify();
   }
   
   public string Name { get { return _TableName; } }
   
   public virtual void Notify()
   {
      if (_ReloadDataSource)
      DataDictCache.Cache.RemoveCache(_TableName);
      
      //绑定组件的数据源
      DataBinderTools.BoundProductCategory(_LookUpEdit, _ImageList);
   }
}

//来源:C/S框架网(www.csframework.com) QQ:23404761



观察者队列全局管理器:

应用场景界面,如《产品成本管理》界面,必须逐个添加观察者到全局管理器,当用户添加、删除或更新基础资料,实时通知相关观察者同步作业。


C# Code:

/// <summary>
/// 观察者队列全局管理器
/// </summary>
public class DataDictObservers
{
   private static List<IObserver> _Observers = new List<IObserver>();
   
   /// <summary>
   /// 增加观察者到队列
   /// </summary>
   /// <param name="observer">观察者</param>
   public static void Add(IObserver observer)
   {
      _Observers.Add(observer);
   }
   
   /// <summary>
   /// 通知观察者
   /// </summary>
   /// <param name="observerName">观察者名称</param>
   public static void Notify(string observerName)
   {
      foreach (IObserver o in _Observers)
      {
         if (o.Name == observerName) o.Notify();
      }
   }
}

//来源:C/S框架网(www.csframework.com) QQ:23404761



实时通知相关观察者同步作业:


C# Code:

/// <summary>
///提交数据成功后,即时进行其它数据操作。
/// </summary>
/// <param name="dataTable"></param>
protected virtual void DoAfterSave(DataTable dataTable)
{
   //同步更新缓存数据
   DataDictCache.Cache.SyncAddOrUpdateCache(dataTable.Rows[0], _UpdateType, _BLL.SummaryTableName, _BLL.KeyFieldName);
   
   //通知观察者列表
   DataDictObservers.Notify(dataTable.TableName);
}

//来源:C/S框架网(www.csframework.com) QQ:23404761


DoAfterSave源码,参考frmBaseDataDictionary.cs 代码。

通知观察者(DataDictObservers.Notify)有以下几种方式:

1. 保存数据字典后即时调用,用户体验较好。
2. 手工点击主窗体下面的任务栏【刷新缓存】按钮。



应用场景:如《产品成本管理》界面

C# Code:

//已注释:观察者模式替代
//DataBinderTools.BoundProductCategory(txt_Category, imageList1);
//DataBinderTools.BoundProductCategory(txtCategory, imageList1);
//DataBinderTools.BoundProductCostParam(repParam);

//采用观察者模式,实时更新当前程序打开多个界面的绑定组件的数据源
DataDictObservers.Add(new ProductCategoryObserver(dt_ProductCategory.__TableName, txtCategory, imageList1));
DataDictObservers.Add(new ProductCategoryObserver(dt_ProductCategory.__TableName, txt_Category, imageList1));
DataDictObservers.Add(new ProductCostParamObserver(dt_CostProductParams.__TableName, repParam));

//来源:C/S框架网(www.csframework.com) QQ:23404761





相关文章:

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


上一篇 下一篇