순서

I. Create Event
II. Publish & Subscribe Event
1. Publish
2. Subscribe


Prism Library에서는 비 동기 이벤트를 위해 PubSub Event를 제공하고

Publish / Subscribe 사이의  Interface를 "IEventAggregator"로 제공한다.

출처 : PrismLibrary.com

 

비 동기 Message Queue vs PubSub Event

2023.02.11 - [Programming/기타] - [Programming][Architecture] Asynchronous Messaging Pattern

 

 


I. Create Event

 

"이 클래스를 이벤트 클래스로 사용할 것입니다" 라는 표시를 해주어야
Prism Library에서 이를 인식하고 Event로 발행할 수 있는데

그 방법은 사용할 Event Class에 PubSubEvent를 상속 받는 것이다.

using Prism.Events;

// 이렇게 사용한다.
public class myEventClass : PubSubEvent<string> {}

// 실제 Project에서 사용한 코드
using Prism.Events;

namespace MapEditer.Events
{
    public class MapItemReadyEvent : PubSubEvent<string>
    {
    }
}
 

UI창인 Main Window에서 Map을 열었을 때 모든 Item들이 로딩 완료인 상태를
이벤트로 전달해주는 코드에 사용하였다.

이렇게 Event를 만들면 끝!

 

 

 


II. Publish & Subscribe Event

한번 더 Publish, Subscribe의 역할을 정리해보면

Publish = EventHandler 실행 = 이벤트를 발생시킴 = 발행
Subscribe = Delegate 저장 = 어떤 함수를 발생시킬지 등록 = 구독

Publish & Subscribe는 EventAggregator 메서드를 호출하여 진행한다.

 


1. Publish

myEventClass에 Subscribe시 설정한 Parameter를 인자 형식으로 하여
이벤트를 발행한다.(실행한다)

using Prism.Events;

public class MainPageViewModel
{
    IEventAggregator _eventAggregator;
    
    // IEventAggregator는 UI Main Window시 자동으로 호출된다.
    public MainPageViewModel(IEventAggregator ea)
    {
        _eventAggregator = ea;
        
        // Publish를 하는 순간 호출이 되므로
        // 필요한 함수를 구현하여 내부에서 Publish하면 된다.
        _eventAggregator.GetEvent<myEventClass>().Publish(Parameter);
    }
}
 

 

2. Subscribe

Delegate에 함수를 등록 할 때 처럼 진행한다.

using Prism.Events;

public class MainPageViewModel2
{
    myEventClass _event;
    public MainPageViewModel2 (IEventAggregator ea) {
        // Event를 가져오고
        // Subscribe를 진행 -> 인자로 함수 넣어줌
        ea.GetEvent<myEventClass>().Subscribe(callBackFunction);
        
        // 이렇게 써도 된다.
        _event = ea.GetEvent<myEventClass>();
        _event.Subscribe(callBackFunction);
        _event.Unsubscribe(callBackFunction); // 구독 해지시
    }
     
    void callBackFunction (parameter) {} // 구현부
}
 
필터링 등등 다른 정의도 있지만 주로 사용하지는 않는다.

+ Recent posts