diff options
3 files changed, 67 insertions, 0 deletions
| -rw-r--r-- | src/Web/PUSG.Web/Events/Api/IEventHandler.cs | 11 | ||||
| -rw-r--r-- | src/Web/PUSG.Web/Events/EventService.cs | 41 | ||||
| -rw-r--r-- | src/Web/PUSG.Web/Events/IEventService.cs | 15 |
diff --git a/src/Web/PUSG.Web/Events/Api/IEventHandler.cs b/src/Web/PUSG.Web/Events/Api/IEventHandler.cs new file mode 100644 index 0000000..5398f44 --- /dev/null +++ b/src/Web/PUSG.Web/Events/Api/IEventHandler.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; + +namespace PUSG.Web.Events.Api +{ + public interface IEventHandler + { + Task HandleEvent(string eventName, object eventArgs); + + bool IsAvailable(); + } +} diff --git a/src/Web/PUSG.Web/Events/EventService.cs b/src/Web/PUSG.Web/Events/EventService.cs new file mode 100644 index 0000000..8ab1b68 --- /dev/null +++ b/src/Web/PUSG.Web/Events/EventService.cs @@ -0,0 +1,41 @@ +using PUSG.Web.Events.Api; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PUSG.Web.Events +{ + public class EventService : IEventService + { + private List<IEventHandler> eventHandlers; + + public EventService() + { + this.eventHandlers = new List<IEventHandler>(); + } + + private void DisposeUnavailable() + { + this.eventHandlers.RemoveAll(eventHandler => !eventHandler.IsAvailable()); + } + + public IEnumerable<IEventHandler> EventHandlers => this.eventHandlers; + + public async Task Publish(string eventName, params object[] args) + { + List<IEventHandler> availableHandlers = this.EventHandlers.Where(eventHandler => eventHandler.IsAvailable()).ToList(); + + foreach (var eventHandler in availableHandlers) + { + await eventHandler.HandleEvent(eventName, args); + } + + this.DisposeUnavailable(); + } + + public void Subscribe(IEventHandler eventHandler) + { + this.eventHandlers.Add(eventHandler); + } + } +} diff --git a/src/Web/PUSG.Web/Events/IEventService.cs b/src/Web/PUSG.Web/Events/IEventService.cs new file mode 100644 index 0000000..11e2c86 --- /dev/null +++ b/src/Web/PUSG.Web/Events/IEventService.cs @@ -0,0 +1,15 @@ +using PUSG.Web.Events.Api; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace PUSG.Web.Events +{ + public interface IEventService + { + IEnumerable<IEventHandler> EventHandlers { get; } + + void Subscribe(IEventHandler eventHandler); + + Task Publish(string eventName, params object[] args); + } +} |