事件的开闭原则
Open Close principle with events
我正在构建一个系统,其中主窗体上有一个数据表,当用户插入或删除某些内容时必须更新该数据表。一旦有特定的表单来执行这些任务,当对话表单上的 CRUD 操作成功终止时,主表单的数据表就会更新。问题是每当我必须添加对数据进行某些更改的其他表单时,我必须在对话框表单上创建一个具有相同意图的事件并将其分配给填充数据表的方法,这违反了开放封闭原则。这是一个例子:
正在更新产品对话框窗体上创建事件:
public static event Action OnUpdateProduct
正在新产品对话框窗体上创建事件:
public static event Action OnUpdateProduct
在主窗体中分配给FrmNewProduct.OnUpdateProduct事件:
FrmNewProduct.OnUpdateProduct += FillDataTable;
在主窗体中分配给FrmUpdateProduct.OnUpdateProduct事件:
FrmUpdateProduct.OnUpdateProduct += FillDataTable;
如何解决此问题以分离主窗体?
EventAggregator 设计模式 (http://martinfowler.com/eaaDev/EventAggregator.html) 将帮助您。它充当发布者和订阅者之间的中介,本质上将两者解耦。
考虑使用 OnUpdateProduct 和 TriggerUpdateProduct() 配套函数构建全局单例 EventDispatcher class。在您的主窗体中,您附加到一个事件,您可以从多个其他窗体触发它。
您需要的只是事件触发器与其订阅之间的解耦。我的示例只是一种简单的方法,您可以考虑其他方法,例如 zmechanic 的建议
我正在构建一个系统,其中主窗体上有一个数据表,当用户插入或删除某些内容时必须更新该数据表。一旦有特定的表单来执行这些任务,当对话表单上的 CRUD 操作成功终止时,主表单的数据表就会更新。问题是每当我必须添加对数据进行某些更改的其他表单时,我必须在对话框表单上创建一个具有相同意图的事件并将其分配给填充数据表的方法,这违反了开放封闭原则。这是一个例子:
正在更新产品对话框窗体上创建事件:
public static event Action OnUpdateProduct
正在新产品对话框窗体上创建事件:
public static event Action OnUpdateProduct
在主窗体中分配给FrmNewProduct.OnUpdateProduct事件:
FrmNewProduct.OnUpdateProduct += FillDataTable;
在主窗体中分配给FrmUpdateProduct.OnUpdateProduct事件:
FrmUpdateProduct.OnUpdateProduct += FillDataTable;
如何解决此问题以分离主窗体?
EventAggregator 设计模式 (http://martinfowler.com/eaaDev/EventAggregator.html) 将帮助您。它充当发布者和订阅者之间的中介,本质上将两者解耦。
考虑使用 OnUpdateProduct 和 TriggerUpdateProduct() 配套函数构建全局单例 EventDispatcher class。在您的主窗体中,您附加到一个事件,您可以从多个其他窗体触发它。
您需要的只是事件触发器与其订阅之间的解耦。我的示例只是一种简单的方法,您可以考虑其他方法,例如 zmechanic 的建议