$mermaidjs
Clean Architecture Demo
Loading...
Searching...
No Matches
CreateTaskCommand.cs
Go to the documentation of this file.
1// TaskManagement.Application/Commands/CreateTask/CreateTaskCommand.cs
2using MediatR;
6
8
37public sealed class CreateTaskCommand : IRequest<Result<Guid>>
38{
39 public string Title { get; set; }
40 public string Description { get; set; }
41 public TaskPriority Priority { get; set; }
42 public DateTime? DueDate { get; set; }
43 public Guid CreatedBy { get; set; }
44
46 string title,
47 string description,
48 TaskPriority priority,
49 DateTime? dueDate,
50 Guid createdBy)
51 {
52 Title = title;
53 Description = description;
54 Priority = priority;
55 DueDate = dueDate;
56 CreatedBy = createdBy;
57 }
58}
59
95public sealed class CreateTaskCommandHandler : IRequestHandler<CreateTaskCommand, Result<Guid>>
96{
97 private readonly ITaskRepository _taskRepository;
98 private readonly IUnitOfWork _unitOfWork;
99 private readonly IDomainEventDispatcher _eventDispatcher;
100
102 ITaskRepository taskRepository,
103 IUnitOfWork unitOfWork,
104 IDomainEventDispatcher eventDispatcher)
105 {
106 _taskRepository = taskRepository;
107 _unitOfWork = unitOfWork;
108 _eventDispatcher = eventDispatcher;
109 }
110
111 public async Task<Result<Guid>> Handle(
112 CreateTaskCommand request,
113 CancellationToken cancellationToken)
114 {
115 ArgumentNullException.ThrowIfNull(request);
116
117 var createResult = TaskItem.Create(
118 request.Title,
119 request.Description,
120 request.Priority,
121 request.DueDate,
122 request.CreatedBy);
123 if (createResult.IsFailure)
124 return Result.Failure<Guid>(createResult.Errors);
125 var task = createResult.Value!;
126 await _taskRepository.AddAsync(task, cancellationToken).ConfigureAwait(false);
127 await _unitOfWork.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
128 // Enviar eventos del dominio después de persistencia exitosa
129 await _eventDispatcher.DispatchAsync(task.DomainEvents, cancellationToken).ConfigureAwait(false);
130 task.ClearDomainEvents();
131 return Result.Success(task.Id);
132 }
133}
CreateTaskCommandHandler es el servicio de aplicación para manejar la creación de tareas.
CreateTaskCommandHandler(ITaskRepository taskRepository, IUnitOfWork unitOfWork, IDomainEventDispatcher eventDispatcher)
async Task< Result< Guid > > Handle(CreateTaskCommand request, CancellationToken cancellationToken)
CreateTaskCommand encapsula la solicitud de creación de una nueva tarea.
CreateTaskCommand(string title, string description, TaskPriority priority, DateTime? dueDate, Guid createdBy)
Result es un tipo de unión discriminada que implementa el patrón Result para manejo de errores.
Definition Result.cs:71
static Result Failure(string error)
TaskItem es una entidad del dominio que representa una tarea en el sistema.
Definition TaskItem.cs:51
static Result< TaskItem > Create(string title, string description, TaskPriority priority, DateTime? dueDate, Guid createdBy)
Definition TaskItem.cs:98
IDomainEventDispatcher es la interfaz para publicación de eventos del dominio.
ITaskRepository es la interfaz del repositorio de escritura para agregado TaskItem.
IUnitOfWork es la abstracción para coordinar la persistencia de cambios de entidades.
TaskPriority
TaskPriority es un objeto valor del dominio que representa niveles de prioridad de tarea.