为什么我们需要为IMessenger.Subscribe()明确设置收件人?

时间:2012-11-16 21:15:16

标签: mvvm-light

以下是Register方法的单一性:

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

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

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

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

2 个答案:

答案 0 :(得分: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属性将不与recipient参数相同。因此,为了保持一致,总是需要收件人参数更安全。

当然,您是正确的,这种情况可能不如您只是将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
    }
}

答案 1 :(得分:0)

这样做可以说Messenger.UnregisterRecepient(recepient);然后取消订阅注册到此接收者的每个操作。