IRecipient<>
接口
IRecipient<>
接口是一个泛型接口,它的泛型参数是一个 TMessage
类型的消息。这个接口定义了一个 Receive
方法,用于接收消息。我们可以通过实现这个接口来接收消息,形如:
public class MyViewModel : ObservableObject, IRecipient<MyMessage>
{
public void Receive(MyMessage message)
{
// 处理消息
}
}
如果这个类需要接收多种 TMessage
类型的消息,那么可以实现多个 IRecipient<>
接口。
在实现了这样的接口后,我们不需要使用传统的方式去注册这些接收消息的方法,而是可以简单地调用 Messenger.RegisterAll(this)
方法,将当前类实现的所有 IRecipient<>
接口的方法注册到信使对象中。类似地,我们可以调用 Messenger.UnregisterAll(this)
方法来注销这些方法。
例如,这里我们使用 WeakReferenceMessenger.Default
作为信使对象。那么,我们的 ViewModel
类可以这样实现:
public class ViewModel : ObservableRecipient, IRecipient<Message>
{
public ViewModel()
{
Messenger.RegisterAll(this);
}
public void Receive(Message message)
{
// 处理消息
}
}
Tip
RegisterAll
方法还包含一个重载,允许传入一个 Token
对象,用于指定消息的频道。类似地,UnregisterAll
方法也包含一个重载,允许传入一个 Token
对象。但如果不传入 Token
对象,则默认为不考虑频道,注销当前对象注册的全部消息。
Note
RegisterAll
方法写在 IMessengerExtensions.cs
中,是对 IMessenger
对象的扩展。它的大致逻辑是,通过反射,找到传入的对象中实现了 IRecipient<>
接口的所有方法,并将它们注册到信使对象中。
UnregisterAll
方法的实现逻辑与 RegisterAll
类似,只是将注册改为注销。这个方法是写在具体的类的实现中的,比如 WeakReferenceMessenger
类。