/// <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) !);
        }
Пример #3
0
 private void sendCommand(IServerCommand command)
 {
     socket.Emit(command.GetType().Name, new JSONObject(command.ToJsonString()));
 }