C#/Prism

[C# - Prism] 프리즘 예제 14 - UsingEventAggregator

반나무 2023. 8. 14. 22:17

안녕하세요, 반나무입니다.

이번 예제는 EventAggregator를 사용하는 방법을 안내합니다.

 

Aggregator 뭔가 단어만으로는 탁! 감이 오지않아서 검색해보니 어떤 정보를 모아서 제공하는 듯한 느낌이네요

EventAggregator는 여기저기 다른 모듈에 퍼져있는 Event들을 모아서 처리 할 수 있도록 해주는 기능입니다.

 

왼쪽이 ModuleA / 오른쪽이 ModuleB입니다.

Send Message를 하면 오른쪽 리스트에 메세지가 들어간다.

UsingEventAggregator.Core

지난 예제에서 설명했듯이, 여러 모듈들이나 다양한곳에서 접근하는 기능들은 .Core에 생성합니다.

이번 예제에서는 Event를 .Core에 생성했습니다.

namespace UsingEventAggregator.Core
{
    // MessageSentEvent라는 Event를 만든다
    // string 타입의 데이터가 넘어온다는것을 알린다.
    public class MessageSentEvent : PubSubEvent<string> { }
}

ModuleA

모듈A에서는 Message를 Binding해 입력받습니다.

public class MessageViewModel : BindableBase
{
    IEventAggregator _ea;

    private string _message = "Message to Send";
    public string Message
    {
        get { return _message; }
        set { SetProperty(ref _message, value); }
    }

    public DelegateCommand SendMessageCommand { get; private set; }

    public MessageViewModel(IEventAggregator ea)
    {
        _ea = ea;
        SendMessageCommand = new DelegateCommand(SendMessage);
    }

    private void SendMessage()
    {
    	// EventAggregator에 메세지를 배포한다.
        _ea.GetEvent<MessageSentEvent>().Publish(Message);
    }
}

ModuleB

모듈B에서는 Event로 들어온 Message를 Collection에 Add하는 작업을 합니다.

public class MessageListViewModel : BindableBase
{
    IEventAggregator _ea;

    private ObservableCollection<string> _messages;
    public ObservableCollection<string> Messages
    {
        get { return _messages; }
        set { SetProperty(ref _messages, value); }
    }

    public MessageListViewModel(IEventAggregator ea)
    {
        _ea = ea;
        Messages = new ObservableCollection<string>();
        
        // Event를 구독한다. (콜백 메소드 구현)
        _ea.GetEvent<MessageSentEvent>().Subscribe(MessageReceived);
    }

    // 콜백 메소드 : message로 받은 string을 ObservableCollection에 add한다.
    private void MessageReceived(string message)
    {
        Messages.Add(message);
    }
}

 

 

반응형