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



我有一个对象(实际上是一个视觉元素和一个viewModel元素),我想在整个项目中多个位置使用它。该对象的功能是收集付款信息。客户史密斯(Smith)从我公司订购了一个小部件,但他的付款时间很晚。他打电话给我说他将在1日全额支付这笔款项。我填写付款金额和日期,单击一个按钮,并使用史密斯先生的拟议付款信息添加到我的数据库中。

现在,正如我所说,我想在多个位置使用此对象,并且根据我使用的位置,我可能希望在单击"提交"按钮后发生更多的事情。除了小部件外,我还出售Whats和Whoozits。收到WhatsIT的付款信息后,我想填充一张额外的表,该表将向客户提供提醒。输入Whoozit付款信息后,我想填充提醒表,并立即向客户发送SMS确认。

我的最初想法只是将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 */ });

经过其中的某些内容后,我想到这是事件的目的它,并在初始数据库输入后提高事件。

是这样吗?如果是这样,为什么要遇到创建自定义事件处理程序的麻烦,一个更好的主意,而不是拥有List<Action>

是这样吗?

可能,是的。如果您想在班上发生某些事情时能够通知任何订阅者,那么提高事件是一种常见和良好的方法。

,如果是这样,为什么要遇到创建自定义事件处理程序的麻烦,一个更好的主意,而不是拥有List<Action>

好吧,将Action<T> S添加到公共List<T>是实施事件的一种复杂的方式。但是我想这实际上会起作用。作为您班级的消费者,我将解释能够使用+=语法订阅事件,而不必从公开暴露的List<T>中添加/删除操作。

事件聚合图案怎么样?当我的ViewModels需要彼此交流时,我经常使用它。

caliburn.micro在您可以使用的内置有一个轻重量。如果您使用IOC容器,则它是一个快照,以确保每个对象都可以获取事件聚合器并自由通信。

事件聚合

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

如前所述,我们提供了事件的实施 给您的聚合器。该实现实现了 但是,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 Event Aggregator

相关内容

  • 没有找到相关文章

最新更新