我有一个对象(实际上是一个可视元素和一个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>
更好?
答案 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
的信息