Como agregar un caso de uso

Esta guia explica como agregar un nuevo caso de uso a un proyecto generado con el arquetipo.

Estructura

Diagram

Un caso de uso se compone de:

  1. Una interfaz con sufijo UseCase en el paquete usecase/ que define el contrato.

  2. Un Command (opcional) que transporta los datos de entrada.

  3. Un servicio en el paquete service/ que implementa la interfaz.

1. Definir la interfaz del caso de uso

Crea una interfaz en el paquete usecase/ del bounded context correspondiente:

public interface CreateTaskUseCase {
    String create(CreateTaskCommand command);
}

Usa un verbo que coincida con la operacion: create, update, remove, find, publish. Evita nombres genericos como execute, perform o handle.

Cuando usar un Command vs parametros directos

// Command
CreateTaskUseCase.create(CreateTaskCommand command)

// Parametros directos
RemoveCartItemUseCase.removeItem(String cartId, String itemId)

// Parametro simple
CancelTaskUseCase.cancel(String taskId)

Para entender el criterio de decision, ver Command, parametros directos, o ambos en el tutorial.

2. Crear el Command (si aplica)

El Command es un DTO sin comportamiento que vive en el mismo paquete usecase/:

@Data
public class CreateTaskCommand {
    private String title;
    private IssueType type;
}

3. Implementar el servicio

Crea una clase package-private en el paquete service/ que implemente la interfaz:

@Service
@RequiredArgsConstructor
class TaskService implements CreateTaskUseCase {

    private final TaskPersistencePort persistencePort;

    @Override
    public String create(CreateTaskCommand command) {
        Task task = Task.create(command.getTitle(), command.getType());
        persistencePort.save(task);
        return task.getId();
    }
}
  • La clase es package-private — no lleva public. Spring la descubre igualmente con @Service.

  • Depende de output ports (interfaces), nunca de adaptadores directamente.

Resumen

Elemento Ubicacion

Interfaz del caso de uso

{domainName}/usecase/

Command (si aplica)

{domainName}/usecase/

Implementacion (servicio)

{domainName}/service/