-
Notifications
You must be signed in to change notification settings - Fork 1
/
EventSourceSinkPattern.cs
173 lines (136 loc) · 4.1 KB
/
EventSourceSinkPattern.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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
using System;
// The event source/sink pattern decouples event sources from event handlers.
// This allows event handlers to be defined at runtime and for multiple event handlers
// to be configured for a given event.
namespace EventSourceSinkPattern
{
#region Event delegates
public delegate void EventAEventHandler(EventAEventArgs e);
public delegate void EventBEventHandler(EventBEventArgs e);
#endregion
#region Event arguments
public class EventAEventArgs : EventArgs
{
public int Value {get; private set;}
public Nullable<bool> Result {get; set;}
public EventAEventArgs(int value)
{
this.Value = value;
}
}
public class EventBEventArgs : EventArgs
{
public string Value {get; private set;}
public EventBEventArgs(string value)
{
this.Value = value;
}
}
#endregion
/// <summary>
/// Event Sink Singleton
/// </summary>
public static class EventSinkSingleton
{
public static event EventAEventHandler EventA;
public static event EventBEventHandler EventB;
public static void InvokeEventA(EventAEventArgs e)
{
if (EventA != null)
EventA(e);
}
public static void InvokeEventB(EventBEventArgs e)
{
if (EventB != null)
EventB(e);
}
public static void Reset()
{
EventA = null;
EventB = null;
}
}
#region Event handlers
public class EventAHandler
{
// Connect the event to the event handler
public static void Initialize()
{
EventSinkSingleton.EventA += new EventAEventHandler(Handle);
}
private static void Handle(EventAEventArgs e)
{
e.Result = (e.Value > 0);
}
}
public class EventBHandler
{
// Connect the event to the event handler
public static void Initialize()
{
EventSinkSingleton.EventB += new EventBEventHandler(Handle);
}
private static void Handle(EventBEventArgs e)
{
Console.WriteLine("EventBHandler - Value from event B source: " + e.Value);
}
}
public class EventBHandler2
{
// Connect the event to the event handler
public static void Initialize()
{
EventSinkSingleton.EventB += new EventBEventHandler(Handle);
}
private static void Handle(EventBEventArgs e)
{
Console.WriteLine("EventBHandler2 - I like : " + e.Value);
}
}
#endregion
#region Event emitters/sources
public class EventASource
{
public void SimulateExternalEvent() { Emit(5); }
private void Emit(int value)
{
var args = new EventAEventArgs(value);
EventSinkSingleton.InvokeEventA(args);
Console.WriteLine("EventASource - Result of event A handler: " + args.Result);
}
}
public class EventBSource
{
public void SimulateExternalEvent() { Emit("Cats"); }
private void Emit(string value)
{
var args = new EventBEventArgs(value);
EventSinkSingleton.InvokeEventB(args);
}
}
#endregion
public static class Program
{
static void Main()
{
Console.WriteLine("\nEvent Source/Sink Pattern");
var eventA = new EventASource();
var eventB = new EventBSource();
Console.WriteLine("\n1 - Events with no handlers configured\n");
eventA.SimulateExternalEvent();
eventB.SimulateExternalEvent();
EventAHandler.Initialize();
EventBHandler.Initialize();
Console.WriteLine("\n2 - Events with handlers configured\n");
eventA.SimulateExternalEvent();
eventB.SimulateExternalEvent();
EventBHandler2.Initialize();
Console.WriteLine("\n3 - Events with multiple handlers configured for one event\n");
eventB.SimulateExternalEvent();
Console.WriteLine("\n4 - Events after event sink reset\n");
EventSinkSingleton.Reset();
eventA.SimulateExternalEvent();
eventB.SimulateExternalEvent();
}
}
}