2017-09-12 49 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

相關問題