1

这是该Register方法的签名:

IMessanger.Register<TMsg>(object recipient, Action<TMsg> action);

如果 action 在其 Target 属性中包含引用,为什么我们需要接收者?当给定动作不使用定义它的类的实例成员时,Target 为空。
但这种情况很少发生。我的意思是这不是我们使用事件处理程序的一种非常常见的方式。

我想了解为什么没有Register没有收件人参数的附加方法签名?我错过了什么重要的东西吗?

IMessanger.Register<TMsg>(Action<TMsg> action);
4

2 回答 2

2

实际上,您可以从应用程序中的任何位置注册特定消息的收件人,而不仅仅是从作为收件人的类中注册。例如,考虑以下场景:

public class ClassA : ViewModelBase
{
    public ClassA()
    {
         Messenger.Default.Register<SomeMessage>(this, SomeAction);
         Messenger.Default.Register<SomeMessage>(ViewModelLocator.ClassB, SomeAction);
    }

    private void SomeAction(SomeMessage msg)
    {
        // do something
    }
}

public class ClassB : ViewModelBase
{
    public ClassB()
    {

    }
}

在第二个Registor方法调用的情况下,Action 的 Target 属性将与接收者参数不同。因此,为了保持一致,总是需要收件人参数很可能更安全。

当然,您是正确的,这种情况可能比您简单地this作为收件人传递的情况不太常见。因此,在这种情况下,如果键入this对您来说变得很麻烦,那么您始终可以定义自己的Register扩展方法,该方法只需将 Target 属性传递给实际Register方法:

public static class MessengerHelper
{
    public static void Register<TMessage>(this IMessenger messenger, Action<TMessage> action)
    {
        messenger.Register<TMessage>(action.Target, action);
    }
}

然后,您可以注册这样的消息:

public class ClassA : ViewModelBase
{
    public ClassA()
    {
         Messenger.Default.Register<SomeMessage>(SomeAction);
    }

    private void SomeAction(SomeMessage msg)
    {
        // do something
    }
}
于 2012-11-20T15:46:29.943 回答
0

这样做是为了让您可以说Messenger.UnregisterRecepient(recepient);哪个然后取消订阅注册到此接收器的每个操作。

于 2012-11-20T15:26:49.707 回答