public Task <CommandResult> Send(ICommand message, Peer peer) { lock (_commands) { _commands.Add(message); if (peer != null) { _messagesByPeerId.GetValueOrAdd(peer.Id, p => new List <IMessage>()).Add(message); } _peerByCommand[message] = peer; } var handler = (peer != null) ? _handlers.GetValueOrDefault(new HandlerKey(message.GetType(), peer.Id)) : null; if (handler == null) { handler = _handlers.GetValueOrDefault(new HandlerKey(message.GetType(), default(PeerId))); } return(HandlerExecutor.Execute(message, handler)); }
public Task <CommandResult> Send(ICommand message, Peer peer) { if (Serializer.TryClone(message, out var clone)) { message = clone; } lock (_commands) { _commands.Add(message); if (peer != null) { _messagesByPeerId.GetValueOrAdd(peer.Id, p => new List <IMessage>()).Add(message); } _peerByCommand[message] = peer; } Func <IMessage, object> handler; if (peer != null) { _handlers.TryGetValue(new HandlerKey(message.GetType(), peer.Id), out handler); } else { handler = null; } // TODO why do we fall back in all cases? if (handler == null) { _handlers.TryGetValue(new HandlerKey(message.GetType(), default), out handler); } return(HandlerExecutor.Execute(message, handler)); }
/// <summary> /// Prepare the invoke parameters. Adds default values if a parameter is missing. /// </summary> /// <param name="originalParameters">Original parameters.</param> /// <param name="executor">Handler executor.</param> /// <returns>Handler parameters.</returns> private object[] PrepareParameters(object[] originalParameters, HandlerExecutor executor) { if (!executor.MethodParameters.Any()) { return(null); } var parameters = new object[executor.MethodParameters.Length]; for (var i = 0; i < parameters.Length; i++) { ParameterInfo methodParameterInfo = executor.MethodParameters.ElementAt(i); if (i < originalParameters.Length) { Type originalObjectType = originalParameters[i]?.GetType(); if (!methodParameterInfo.ParameterType.IsAssignableFrom(originalObjectType)) { object transformedParameter = _parameterTransformer?.Transform(originalParameters[i], methodParameterInfo.ParameterType.GetTypeInfo()); parameters[i] = transformedParameter ?? executor.GetDefaultValueForParameter(i); } else { parameters[i] = originalParameters[i]; } } else { parameters[i] = executor.GetDefaultValueForParameter(i); } } return(parameters); }
/// <summary> /// Creates a new <see cref="HandlerActionInvokerCacheEntry"/> instance. /// </summary> /// <param name="handlerType">Target handler type.</param> /// <param name="handlerFactory">Handler factory creator function.</param> /// <param name="handlerReleaser">Handler releaser action.</param> /// <param name="handlerExecutor">Handler action executor.</param> internal HandlerActionInvokerCacheEntry(Type handlerType, Func <Type, object> handlerFactory, Action <object> handlerReleaser, HandlerExecutor handlerExecutor) { HandlerType = handlerType; HandlerFactory = handlerFactory; HandlerReleaser = handlerReleaser; HandlerExecutor = handlerExecutor; }
private void OnGenerateLiquibaseCommand(object obj) { HandlerExecutor.Execute <GenerateLiquibaseHandler>(ExecutionEvent.Create(obj as List <TreeNavigationItem>)); }
private void OnCloseProjectCommand(object obj) { HandlerExecutor.Execute <CloseProjectHandler>(null); }
private void OnOpenProjectCommand(object obj) { HandlerExecutor.Execute <OpenProjectHandler>(null); }
public void AddExecutor(HandlerExecutor executor) { throw new NotImplementedException(); }
private void OnCopyCommand(object obj) { HandlerExecutor.Execute <CopyHandler>(ExecutionEvent.Create(obj as List <TreeNavigationItem>)); }
private void OnUpdateCommand(object obj) { HandlerExecutor.ExecuteEx(typeof(UpdateEntityHandler <>), obj); }
private void OnNewCompmositeTypeElementCommand(object obj) { HandlerExecutor.Execute <NewCompositeTypeElementHandler>(ExecutionEvent.Create(obj as List <TreeNavigationItem>)); }
private void OnNewFolderCommand(object obj) { HandlerExecutor.Execute <NewFolderHandler>(ExecutionEvent.Create(obj as List <TreeNavigationItem>)); }
private void OnPasteCommand(object obj) { HandlerExecutor.ExecuteEx(typeof(PasteHandler <>), obj); }
private void OnSetAsDefaultCommand(object obj) { HandlerExecutor.Execute <DefaultHandler>(ExecutionEvent.Create((List <TreeNavigationItem>)obj, GetMasterNavigationItem())); }