2017-09-12 48 views
-2

我有一个对象(实际上是一个可视元素和一个viewmodel元素),我想在整个项目中的多个位置使用它。目标的功能是收集付款信息。客户史密斯从我的公司订购了一个Widget,但他付款迟了。他打电话给我说他会在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>更好?

+0

你不需要,你总是可以从EventArgs的延伸只是定制ARGS,并且使用的buildin处理 – sTrenat

+0

你碰巧使用MVVMlight?有一个内置的Messenger。 – Fildor

+2

是的,事件在这种情况下应该是有用的。没有令人信服的理由,我认为它需要成为一个自定义事件。你可能已经进入了这种思维定势,因为你太过于关注“添加”了。事件已经自己完成了,所有你需要的是订阅事件的+ =操作符。 –

回答

0

是这样吗?

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

如果是的话,为什么要通过创建一个自定义事件处理程序比仅仅有一个List<Action>一个更好的主意的麻烦?

好吧,将Action<T>秒加入公众List<T>是一种执行事件的复杂方法。但我想它实际上会起作用。作为您班级的消费者,我会尽力使用+=语法来订阅活动,而不必从公开曝光的List<T>添加/删除操作。

+0

我对最后一句话感到困惑。我了解有这样一个行动清单的意图是这些行动是在事件发生时执行的。因此,如果他举例有一个公开的方法,注册人可以将行动列入清单,则可以简单注册回调。从这个意义上说,你*可以*实际上“订阅”该列表。 – Fildor

+0

你是什么意思?在向列表中添加动作时应如何通知订阅者? – mm8

+0

他不会被告知这件事。订阅者确实添加了一个动作。在OP中,该列表甚至是公开的。所以任何客户端都可以简单地做'moneyGetterInstance.AfterEvents.Add(MyAction);' – Fildor

0

事件聚合器模式呢?当我的视图模型需要相互交流时,我经常使用它。

Caliburn.Micro有一个轻量级的内置,你可以使用。如果您使用IoC容器,那么可以快速确保每个对象都可以获得对事件聚合器的引用并自由通信。

事件聚集

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

如前所述,我们为您提供了事件 Aggregator的实施。该实现实现了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

相关问题