public async Task HandleEventAsync(IExportEvent exportEvent, CancellationToken token) { if (exportEvent == null) { throw new ArgumentNullException(nameof(exportEvent)); } var handlerType = GetHandlerType(exportEvent); if (handlerType == null) { return; } var handlers = (IEnumerable <object>)_services.GetService(handlerType); if (!handlers.Any()) { return; } var method = GetHandlerMethod(exportEvent); await method(handlers, exportEvent, token); }
private void Handle(IExportEvent <UpdateObjectPayload> exportEvent, CancellationToken token) { if (exportEvent.Event != EventType.UpdateObject) { return; } var id = exportEvent.Payload.Id; var position = exportEvent.Payload.Position; var isUpdated = false; do { if (!_state.Objects.TryGetValue(id, out var obj)) { return; } var updated = obj with { Position = position }; isUpdated = _state.Objects.TryUpdate(id, updated, obj); } while (!isUpdated); } }
private static GenericHandlerDelegate GetHandlerMethod(IExportEvent exportEvent) { return(HandlerMethodMap.GetOrAdd(exportEvent.GetType(), type => { var payloadType = GetPayloadType(type); if (payloadType == null) { return null; } var handlersType = typeof(IEnumerable <>).MakeGenericType( typeof(IExportEventHandler <>).MakeGenericType(payloadType) ); var eventType = typeof(IExportEvent <>).MakeGenericType(payloadType); var method = HandleGenericEventMethod.MakeGenericMethod(payloadType); var handlersParam = Expression.Parameter(typeof(object), "handlers"); var eventParam = Expression.Parameter(typeof(IExportEvent), "exportEvent"); var tokenParam = Expression.Parameter(typeof(CancellationToken), "token"); var castHandlers = Expression.Convert(handlersParam, handlersType); var castEvent = Expression.Convert(eventParam, eventType); var callExpression = Expression.Call(method, castHandlers, castEvent, tokenParam); var lambda = Expression.Lambda <GenericHandlerDelegate>(callExpression, handlersParam, eventParam, tokenParam); return lambda.Compile(); })); }
private void Handle(IExportEvent <AddObjectPayload> exportEvent, CancellationToken token) { if (exportEvent.Event != EventType.AddObject) { return; } _state.Objects.TryAdd(exportEvent.Payload.Id, exportEvent.Payload); }
Task IExportEventHandler.HandleEventAsync(IExportEvent exportEvent, CancellationToken token) { lock (_syncRoot) { _events.Add(exportEvent); } return(Task.CompletedTask); }
private void Handle(IExportEvent <RemoveObjectPayload> exportEvent, CancellationToken token) { if (exportEvent.Event != EventType.RemoveObject) { return; } _state.Objects.TryRemove(exportEvent.Payload.Id, out _); }
public Task HandleEventAsync(IExportEvent <InitPayload> exportEvent, CancellationToken token) { _state.IsRunning = true; _state.MissionName = exportEvent.Payload.MissionName; _state.Theatre = exportEvent.Payload.Theatre; _state.MapCenter = exportEvent.Payload.MapCenter; return(Task.CompletedTask); }
public Task HandleEventAsync(IExportEvent <MissionEndPayload> exportEvent, CancellationToken token) { _state.IsRunning = false; _state.Objects.Clear(); _state.Airbases.Clear(); _state.MissionName = null; _state.Theatre = null; _state.MapCenter = null; _state.Time = default; return(Task.CompletedTask); }
private static Type GetHandlerType(IExportEvent exportEvent) { return(EventHandlerTypeMap.GetOrAdd(exportEvent.GetType(), type => { var payloadType = GetPayloadType(type); if (payloadType == null) { return null; } var handlerType = typeof(IExportEventHandler <>).MakeGenericType(payloadType); var enumerableType = typeof(IEnumerable <>).MakeGenericType(handlerType); return enumerableType; })); }
private void Handle(IExportEvent <TimePayload> exportEvent, CancellationToken token) { _state.Time = exportEvent.Payload.Time; }
public Task HandleEventAsync(IExportEvent <TimePayload> exportEvent, CancellationToken token) { Handle(exportEvent, token); return(Task.CompletedTask); }
private static async Task HandleGenericEventAsync <T>(IEnumerable <IExportEventHandler <T> > handlers, IExportEvent <T> exportEvent, CancellationToken token) { foreach (var handler in handlers) { await handler.HandleEventAsync(exportEvent, token); } }
private void Handle(IExportEvent <AddAirbasePayload> exportEvent) { _liveState.Airbases[exportEvent.Payload.Id] = exportEvent.Payload; }