我有一个对象(实际上是一个视觉元素和一个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