何时以及为何使用自定义事件处理程序

时间:2017-09-12 15:05:39

标签: c# wpf events delegates event-handling

我有一个对象(实际上是一个可视元素和一个viewmodel元素),我想在整个项目的多个地方使用它。对象的功能是收集支付信息。顾客史密斯从我的公司订购了一个小工具,但他付款的时间已经很晚了。他打电话给我说他将在1日全额支付金额。我填写了付款金额和日期,点击了一个按钮,并根据史密斯先生提出的付款信息将一个条目添加到我的数据库中。

现在,正如我所说,我想在多个地方使用这个对象,并且根据我在哪里使用它,我可能希望在点击提交按钮后发生更多。与Widgets一起,我还出售Whatsits和Whoozits。在收到Whatsit的付款信息后,我想填写一个额外的表格,该表格将向客户发送提醒。输入Whoozit付款信息后,我想填写提醒表,并立即向客户发送短信确认。

我最初的想法只是向我的原始对象添加List<Action>字段,并根据我从哪里访问它,在原始数据库更新完成后发送我想要完成的任何其他操作

这样的事情:

public class MoneyGetter
{
    public List<Action> AfterEvents = new List<Action>();

    public void SavePaymentInfo()
    {
        //logic for initial database entry

        foreach(var a in AfterEvents)
        {
            a.Invoke();
        }
    }
}

创建对象后,根据我使用它的位置,我只需添加

var mg = new MoneyGetter();
mg.AfterEvents.Add(() => { /* add situation specific action logic here */ });

在完成其中一些之后,我发现这是事件的目的(我认为),我应该为我的MoneyGetter对象创建一个自定义的OnSubmitted事件,从任何使用的对象订阅该事件它,并在初始数据库输入后提升事件。

是这样的吗?如果是这样,为什么要创建自定义事件处理程序的麻烦比仅仅List<Action>更好?

2 个答案:

答案 0 :(得分:0)

  

是这样的吗?

可能,是的。如果您希望能够在课堂上发生任何事情时通知任何订阅者,举办活动是一种常见而且很好的方法。

  

如果是这样,为什么要创建一个自定义事件处理程序的麻烦不仅仅是List<Action>

好吧,将Action<T>添加到公开List<T>是一种实现事件的复杂方式。但我想它确实会奏效。作为您班级的消费者,我会说明能够使用+=语法订阅活动,而不必在公开的List<T>中添加/删除操作。

答案 1 :(得分:0)

事件聚合器模式怎么样?当我的视图模型需要在彼此之间进行通信时,我经常使用它。

Caliburn.Micro内置一个轻巧的,你可以使用。如果你使用IoC容器,那么它就是一个快照,以确保每个对象都可以获得对事件聚合器的引用并自由地进行通信。

  

事件聚合器

     

Caliburn.Micro预先捆绑了一个Event Aggregator,   方便地称为EventAggregator。对于那些不熟悉的事件   聚合器是一种提供发布对象的服务   从一个实体到另一个实体以松散的方式。事件   聚合器实际上是一种模式,它的实现可以有所不同   框架到框架。对于Caliburn.Micro,我们专注于制作我们的   Event Aggregator实现简单易用而不牺牲   功能或灵活性。入门

     

如前所述,我们提供了Event的实现   聚合器给你。这个实现实现了   但是,IEventAggregator接口可以提供自己的接口   如果需要,实施。请花点时间熟悉一下   自己使用IEventAggregator签名。

public interface IEventAggregator {
  bool HandlerExistsFor(Type messageType);
  void Subscribe(object subscriber);
  void Unsubscribe(object subscriber);
  void Publish(object message, Action<Action> marshal);
} 

来自https://caliburnmicro.codeplex.com/wikipage?title=The%20Event%20Aggregator

的信息