public ICommandResult <TOutput> Execute <TInput, TOutput>(ISerialization <TInput> input, ISerialization <TOutput> output, TInput data) { var either = CommandResult <TOutput> .Check <Argument <TInput>, TInput>(input, output, data, CreateExampleArgument); if (either.Error != null) { return(either.Error); } var argument = either.Argument; var rootType = DomainModel.Find(argument.Name); if (rootType == null) { return(CommandResult <TOutput> .Fail( "Couldn't find aggregate root type {0}.".With(argument.Name), @"Example argument: " + CommandResult <TOutput> .ConvertToString(CreateExampleArgument(output)))); } if (!typeof(IAggregateRoot).IsAssignableFrom(rootType)) { return(CommandResult <TOutput> .Fail(@"Specified type ({0}) is not an aggregate root. Please check your arguments.".With(argument.Name), null)); } if (!Permissions.CanAccess(rootType)) { return (CommandResult <TOutput> .Return( HttpStatusCode.Forbidden, default(TOutput), "You don't have permission to access: {0}.", argument.Name)); } if (argument.Uri == null) { return(CommandResult <TOutput> .Fail( "Uri to update not specified.", @"Example argument: " + CommandResult <TOutput> .ConvertToString(CreateExampleArgument(output, rootType)))); } if (argument.Data == null) { return(CommandResult <TOutput> .Fail( "Data to update not specified.", @"Example argument: " + CommandResult <TOutput> .ConvertToString(CreateExampleArgument(output, rootType)))); } try { var commandType = typeof(UpdateCommand <>).MakeGenericType(rootType); var command = Activator.CreateInstance(commandType) as IUpdateCommand; var result = command.Update(input, output, Locator, argument.Uri, argument.Data); return(CommandResult <TOutput> .Success(result, "Object updated")); } catch (ArgumentException ex) { return(CommandResult <TOutput> .Fail( ex.Message, ex.GetDetailedExplanation() + @" Example argument: " + CommandResult <TOutput> .ConvertToString(CreateExampleArgument(output, rootType)))); } }