使用观察者模式实时更新程序打开多个界面绑定组件的数据源
使用观察者模式实时更新程序打开多个界面绑定组件的数据源
观察者实例1:
观察者实例2:
实时通知相关观察者同步作业:
DoAfterSave源码,参考frmBaseDataDictionary.cs 代码。
使用观察者模式(Observer Pattern),实时更新当前程序打开多个界面的绑定组件的数据源。
实例截图参考:
观察者接口设计:
C# Code:
public interface IObserver
{
string Name { get; }
void Notify();
}
public interface IObserver
{
string Name { get; }
void Notify();
}
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
/// <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
/// <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
/// <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
/// <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
//已注释:观察者模式替代
//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#实现缓存数据更新
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网