[WPF] WeakReferenceMessenger으로 메시지 보내기

[WPF] WeakReferenceMessenger으로 메시지 보내기

이번 글에서는 WeakReferenceMessenger에 대해 알아보겠습니다. WeakReferenceMessenger는 Community Tookit.Mvvm 라이브러리에서 제공하는 메시지 패턴의 구현체입니다. 말 그대로 메시지를 전달하는 역할을 합니다. WeakReferenceMessenger에는 Sender(보내는 사람)와 Recipient(받는 사람)이 있는 발행/구독 패턴이며, 문자 그대로 약한 참조(Weak Reference)가 핵심적인 틍직입니다. 이 특징으로 더 이상 사용되지 않는 객체가 메모리에서 해제되는 것을 방해하지 않으며, 메모리 누수 방지와 더불어 느슨한 결합이 큰 장점입니다.

핵심 동작 원리

메시지 정의, 보내는 쪽, 받는 쪽만 정의하면 됩니다.

우선 메시지 정의 입니다. 메시지를 정의할 땐 ValueChangedMessage 클래스를 사용해서 Type T 부분을 정의해줍니다. 아래는 string 타입을 가지는 ValueChangedMessage 객체입니다. 객체를 생성할 때 생성자에 정의한 타입의 데이터를 파라미터로 입력해줍니다.

ValueChangedMessage<string> message = new ValueChangedMessage<string>(SendValue);

보내는 쪽에서는 아래와 같이 코드를 사용하기만 하면 됩니다. 위에서 정의한 메시지를 Send해보겠습니다.

WeakReferenceMessenger.Default.Send(message);

받는 쪽 코드는 간단합니다. 받는 쪽에서 IRecipient 인터페이스를 정의 한 뒤 Receive 함수를 정의하면 됩니다.

public class ReceiveViewModel : BindableBase, IRecipient<ValueChangedMessage<string>>
{
    public void Receive(ValueChangedMessage<string> message)
    {
        string recvText = message.Value;
    }
}

또는 받는 쪽에서 정의된 메시지를 등록한 뒤 처리하면 됩니다.

WeakReferenceMessenger.Default.Register<ValueChangedMessage<string>>(this, OnReceiveMessage);

private void OnReceiveMessage(object recipient, ValueChangedMessage<string> message)
{
    string recvText = message.Value;
}

Token으로 메시지 분류

위 방식대로 WeakReferenceMessenger에서 Send를 하면 받는 쪽에서 Regist가 되어 있다면 모든 구독자가 메시지를 수신합니다. WeakReferenceMessenger에서는 Send 함수 두번째 파라미터 Token을 입력해서 같은 Token으로 등록한 구독자만 메시지를 받습니다. 보내는 쪽에서는 아래와 같이 Token을 두번째 인자로 입력하기만 하면 됩니다. Token은 string 타입을 사용하였습니다.

WeakReferenceMessenger.Default.Send(message, Token);

받는 쪽에서는 아래처럼 등록해야 합니다.

WeakReferenceMessenger.Default.Register<ValueChangedMessage<string>, string>(this, Token, OnReceiveMessageByToken);

private void OnReceiveMessageByToken(object recipient, ValueChangedMessage<string> message)
{
    string recvText = message.Value;
}

샘플 프로그램 실행

위에서 코드를 적절히 잘 조합하면 아래와 같이 동작하는 프로그램을 만들 수 있습니다.


github