// usecase class UseCaseX { private readonly UserCreator _userCreator; private readonly UserRoleAssigner _userRoleAssigner; public Task> Execute(Input input) { var trx = beginTransaction(); var creationResult = await _userCreator.Create(new {...}); if(creationResult.isError) return ... var assignationResult = await _userRoleAssigner.Assign(creationResult.User.Id, [...roles...]); if(assignationResult.IsError) return ... orm.saveChanges(); trx.commit(); } } // api handler public async Task CreateTemplate( [FromBody] CreateTemplateRequest request, [FromServices] IValidator validator, [FromServices] CreateTemplateUseCase useCase) { if (Validate(validator, request) is { IsValid: false } failedModelState) { return ValidationProblem(failedModelState); } ErrorOr result = await useCase.Execute(new CreateTemplateData { CreateTemplate = ...transform request data... }); if (result.IsError) { return new ErrorResult(result.FirstError); } return Json(new CreateTemplateResponse { Data = ...transform response data... }); }