簡體   English   中英

MVVMLight :這是使用 Messenger 的正確方法嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM