private void ExecuteCommand <TCommand>(TCommand command, CommandModel commandModel) where TCommand : Command { IExecute <TCommand> handler = null; try { handler = (IExecute <TCommand>)_serviceFactory.Build(typeof(IExecute <TCommand>)); _logger.Trace("{0} -> {1}", command.GetType().Name, handler.GetType().Name); _commandQueueManager.Start(commandModel); BroadcastCommandUpdate(commandModel); if (ProgressMessageContext.CommandModel == null) { ProgressMessageContext.CommandModel = commandModel; } handler.Execute(command); _commandQueueManager.Complete(commandModel, command.CompletionMessage ?? commandModel.Message); } catch (CommandFailedException ex) { _commandQueueManager.SetMessage(commandModel, "Failed"); _commandQueueManager.Fail(commandModel, ex.Message, ex); throw; } catch (Exception ex) { _commandQueueManager.SetMessage(commandModel, "Failed"); _commandQueueManager.Fail(commandModel, "Failed", ex); throw; } finally { BroadcastCommandUpdate(commandModel); _eventAggregator.PublishEvent(new CommandExecutedEvent(commandModel)); if (ProgressMessageContext.CommandModel == commandModel) { ProgressMessageContext.CommandModel = null; } if (handler != null) { _logger.Trace("{0} <- {1} [{2}]", command.GetType().Name, handler.GetType().Name, commandModel.Duration.ToString()); } } }