[英]MVVMLight : is this the right way to use the Messenger?
我有一個管理客戶和地址的經典業務應用程序。
有選項卡項(Id、GenericInfo 等),每個項都有自己的 ViewModel。
有一個 MainViewModel 處理客戶端及其地址的保存和加載命令。
我們從 WCF 服務中檢索數據。 從每個 WCF 函數接收/發送的數據聚合在不同的容器中。
在我的 MainViewModel 中,我創建了一個 SaveContainer,然后將它與 Messenger 一起發送。
public void Save()
{
var container = new SaveContainer();
MessengerInstance.Send(container);
//the container is now populated and ready to be sent via WCF
Console.WriteLine(container.User.Name);
Console.WriteLine(container.Address.StreetName);
Console.WriteLine(container.Address2.StreetName);
}
在我的 UserViewModel 中注冊了該容器,然后視圖模型用它擁有的數據(用戶)填充它。
public UserViewModel()
: base(Messenger.Default)
{
User = new User();
MessengerInstance.Register<SaveContainer>(this, (x) => x.User = User);
}
在我的 AddressViewModel 中,我也這樣做。
public AddressViewModel()
: base(Messenger.Default)
{
Address = new Address();
Address2 = new Address() { StreetName = "Washington Street" };
MessengerInstance.Register<SaveContainer>(this, x =>
{
x.Address = Address;
x.Address2 = Address2;
});
}
當我必須加載數據時,我也會這樣做。
在我發送消息后,我假設每個注冊的 ViewModel 都收到了消息並處理了它。 我假設錯了嗎? 您認為這種方式是使用 Messenger 的正確方式嗎? 你會改進什么?
沒有使用信使的正確方法。 但是,您必須考慮到該消息由所有注冊該消息的收件人處理,而不僅僅是預期的子集。 此外,在使用消息傳遞時,您無法控制消息處理何時完成,現在您是否會在所有收件人處理完消息時收到通知。 此外 - 取決於信使的實現 - 可以並行處理消息。
因此,您的方法(以及@cadrell0 使用回調的擴展名)的問題在於您不知道所有收件人何時都處理了消息。 使用回調,您將獲得處理消息的每個接收者的回調(即 n 個接收者 n 個回調)。
那么如何檢查所有收件人何時處理完郵件?
在我看來,消息傳遞更像是一種通知機制,即您通知某些收件人發生了某些事情。 如果您知道並且可以確保只有一個收件人,您甚至可以按照您描述的方式使用它,但是一旦涉及多個收件人,就會導致上述問題。
那么這會讓你在哪里......在你的szenario中我傾向於將視圖模型設計為“相關”(即主視圖模型知道用戶視圖模型和地址視圖模型 - 或者主視圖模型知道用戶如果更合適的話,視圖模型又知道地址視圖模型)。 通常,我還會設計一個模型來保存我必須處理的工作單元(在您的情況下是 SaveContainer)。 然后所有的視圖模型都是從這個模型構建的,並將它們的數據寫入其中。 在正常情況下,此工作單元是您從數據存儲服務中獲得的內容,而數據存儲又會在單個事務中保存這些內容。
但同樣,MVVM 沒有正確的方法!
如果我需要在收件人回復消息后做某事,我會在我的消息中包含回調。 當接收者完成時,它執行回調。 向回調添加參數允許接收者向發送者發送數據。 這也允許接收者執行異步操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.