public async Task <Response <TodoItem> > HandleAsync(CreateTodoItemRequest request) { var todoItemEntityResponse = new Response <TodoItemEntity>(); // Query. Apply all validation and modification rules. These rules can only query the database. await _rulesEngine.ProcessAsync(request, todoItemEntityResponse, _createRulesFactory.Create().ToList()); if (todoItemEntityResponse.HasErrors()) { return(new Response <TodoItem>(todoItemEntityResponse.Notifications)); } // Query. Apply all validation and modification rules. These rules can only query the database. await _rulesEngine.ProcessAsync(request, todoItemEntityResponse, _saveRulesFactory.Create().ToList()); if (todoItemEntityResponse.HasErrors()) { return(new Response <TodoItem>(todoItemEntityResponse.Notifications)); } // Command. Save the data. await _createTodoItemRepository.SaveAsync(todoItemEntityResponse); LogTodoItemEntityResponse(todoItemEntityResponse); return(new Response <TodoItem>(todoItemEntityResponse.Notifications, TodoItemMapper.MapToTodoItem(todoItemEntityResponse.Item))); }