/// <inheritdoc /> public Task ExecuteAsync(IServerCommand serverCommand, CancellationToken cancellationToken) { var serverCommandType = serverCommand.GetType(); if (!_serverCommandHandlerInfo.TryGetValue(serverCommandType, out var commandHandlerInfo)) { var handlerType = typeof(IServerCommandHandler <>).MakeGenericType(serverCommandType); var executeAsyncMethod = handlerType.GetRuntimeMethod("ExecuteAsync", new[] { serverCommandType, typeof(CancellationToken) }); var handler = _ftpConnectionAccessor.FtpConnection.ConnectionServices.GetRequiredService(handlerType); commandHandlerInfo = new CommandHandlerInfo(handler, executeAsyncMethod); _serverCommandHandlerInfo.Add(serverCommandType, commandHandlerInfo); } return((Task)commandHandlerInfo.ExecuteMethodInfo.Invoke( commandHandlerInfo.CommandHandler, new object[] { serverCommand, cancellationToken })); }
/// <inheritdoc /> public Task ExecuteAsync(IServerCommand serverCommand, CancellationToken cancellationToken) { var serverCommandType = serverCommand.GetType(); if (!_serverCommandHandlerDelegates.TryGetValue(serverCommandType, out var cmdDelegate)) { var handlerType = typeof(IServerCommandHandler <>).MakeGenericType(serverCommandType); var executeAsyncMethod = handlerType.GetRuntimeMethod("ExecuteAsync", new[] { serverCommandType, typeof(CancellationToken) }); var handler = _ftpConnectionAccessor.FtpConnection.ConnectionServices.GetRequiredService(handlerType); var commandParameter = Expression.Parameter(serverCommandType, "serverCommand"); var cancellationTokenParameter = Expression.Parameter(typeof(CancellationToken), "cancellationToken"); var call = Expression.Call( Expression.Constant(handler), executeAsyncMethod, commandParameter, cancellationTokenParameter); var expr = Expression.Lambda(call, commandParameter, cancellationTokenParameter); cmdDelegate = expr.Compile(); _serverCommandHandlerDelegates.Add(serverCommandType, cmdDelegate); } return((Task)cmdDelegate.DynamicInvoke(serverCommand, cancellationToken) !); }
private void sendCommand(IServerCommand command) { socket.Emit(command.GetType().Name, new JSONObject(command.ToJsonString())); }