我有一個對象(實際上是一個可視元素和一個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>
更好?
你不需要,你總是可以從EventArgs的延伸只是定製ARGS,並且使用的buildin處理 – sTrenat
你碰巧使用MVVMlight?有一個內置的Messenger。 – Fildor
是的,事件在這種情況下應該是有用的。沒有令人信服的理由,我認爲它需要成爲一個自定義事件。你可能已經進入了這種思維定勢,因爲你太過於關注「添加」了。事件已經自己完成了,所有你需要的是訂閱事件的+ =操作符。 –