MVVMLight消息记录

时间:2013-11-28 17:32:53

标签: .net logging message mvvm-light messenger

我想记录通过MVVMLight默认信使发送的所有消息。 为此,我需要一个包装类source,它将有关发送方和接收方的信息写入调试输出。

以下包装类成功将已发送消息和发件人名称记录到调试中。 但是它没有正确记录接收消息: 发送邮件时,收件人会被记录一次。 再次发送相同的消息时,收件人将不会收到该消息。

Imports GalaSoft.MvvmLight.Messaging

Public Class MonitoringMessenger

    Public Shared Sub Send(Of TMessage)(message As TMessage, sender As Object)

        Debug.WriteLine(sender.GetType.Name & "(" & sender.GetHashCode() & ") sended " & GetType(TMessage).Name)
        Messenger.Default.Send(Of TMessage)(message)

    End Sub

    Public Shared Sub Register(Of TMessage)(ByVal recipient As Object, action As Action(Of TMessage))

        Dim monitoredAction As Action(Of TMessage) = Sub(msg As TMessage)
                                                         action.Invoke(msg)
                                                         Debug.WriteLine(recipient.GetType.Name & "(" & recipient.GetHashCode() & ") received " & GetType(TMessage).Name)
                                                     End Sub

        Messenger.Default.Register(Of TMessage)(recipient, monitoredAction)

    End Sub

End Class

我把它称为真正的mvvm光信使:

MonitoringMessenger.Register(Of TextMessage)(Me, AddressOf OnTextMessageReceived)

发送:

MonitoringMessenger.Send(Of TextMessage)(New TextMessage(Me.InputTextBox.Text), Me)

所以我的问题是,我的通用代码出了什么问题? 为什么收到一条消息然后又不再收到消息?

我已经测试了非通用版本,但它运行正常。 但这很不方便,因为我有很多消息类型。

修改 我经历过,当我没有在monitoredAction inline-delegate中引用任何变量时,它就可以工作。

这样可行:

Public Shared Sub Register(Of TMessage)(ByVal recipient As Object, action As Action(Of TMessage))

        Dim monitoredAction As Action(Of TMessage) = Sub(msg As TMessage)
                                                         Debug.WriteLine("monitoredAction called")
                                                     End Sub

        Messenger.Default.Register(Of TMessage)(recipient, monitoredAction)

    End Sub

如何在不更改代理签名的情况下访问变量 操作 收件人 > Sub(msg作为TMessage))?

0 个答案:

没有答案