以下是Register
方法的单一性:
IMessanger.Register<TMsg>(object recipient, Action<TMsg> action);
如果action在其Target属性中保存引用,为什么我们需要收件人? 当给定的动作不使用定义它的类的实例成员时,Target为null 但这很少发生。我的意思是,我们使用事件处理程序并不是一种非常常见的方式。
我想了解为什么没有没有收件人参数的附加Register
方法签名?我错过了一些重要的事情吗?
IMessanger.Register<TMsg>(Action<TMsg> action);
答案 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);
然后取消订阅注册到此接收者的每个操作。