■ EventStream 클래스의 Subscribe 메소드에서 특정 주제에 일치하는 경우만 처리하는 방법을 보여준다.
▶ ITopicMessage.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
namespace TestProject; /// <summary> /// 주제 메시지 인터페이스 /// </summary> public interface ITopicMessage { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 주제 - Topic /// <summary> /// 주제 /// </summary> string Topic { get; } #endregion } |
▶ TopicMessage.cs
1 2 3 4 5 6 7 8 9 10 |
namespace TestProject; /// <summary> /// 커스텀 메시지 /// </summary> /// <param name="Name">명칭</param> /// <param name="Topic">주제</param> public record TopicMessage(string Name, string Topic) : ITopicMessage; |
▶ EventStreamExtension.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
using Microsoft.VisualBasic; using Microsoft.VisualBasic.CompilerServices; using Proto; namespace TestProject; /// <summary> /// 이벤트 스트림 확장 /// </summary> public static class EventStreamExtension { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 주제에 구독하기 - SubscribeToTopic<T>(eventStream, topic, action) /// <summary> /// 주제에 구독하기 /// </summary> /// <typeparam name="T">주제 메시지 인터페이스</typeparam> /// <param name="eventStream">이벤트 스트림</param> /// <param name="topic">주제</param> /// <param name="action">액션</param> /// <returns>이벤트 스트림 구독</returns> public static EventStreamSubscription<object> SubscribeToTopic<T>(this EventStream eventStream, string topic, Action<T> action) where T : ITopicMessage { return eventStream.Subscribe<T> ( x => { if(!LikeOperator.LikeString(x.Topic, topic, CompareMethod.Binary)) { return; } action(x); } ); } #endregion } |
▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
using Proto; namespace TestProject; /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { ActorSystem actorSystem = new ActorSystem(); actorSystem.EventStream.SubscribeToTopic<TopicMessage>("Topic.*", x => Console.WriteLine($"메시지 : {x.Name} - {x.Topic}")); actorSystem.EventStream.Publish(new TopicMessage("홍길동", "Topic.Cosmos")); actorSystem.EventStream.Publish(new TopicMessage("홍길동", "AnotherTopic")); actorSystem.EventStream.Publish(new TopicMessage("김철수", "Topic.Computer")); Console.WriteLine("프로그램을 종료하기 위해서 아무 키나 눌러 주시기 바랍니다."); Console.ReadKey(false); } #endregion } |