Implementação dos Services
A camada de service é crucial na arquitetura de uma aplicação, pois ela media as interações entre a camada de apresentação (controladores) e a camada de domínio (repositórios). Além disso, encapsula a lógica de negócios e as regras associadas, garantindo a correta execução das operações e manutenção da integridade dos dados.
Serviço Básico
Aqui está um exemplo de um serviço básico que utiliza um repositório genérico para operações CRUD. Esta implementação básica é suficiente para muitos casos de uso sem regras complexas:
package com.webpublico.ead.application.service.academico;
import br.com.archbase.security.usecase.GetSecurityData;
import com.webpublico.ead.application.service.BaseService;
import com.webpublico.ead.application.validator.BaseValidator;
import com.webpublico.ead.domain.model.academico.Topico;
import com.webpublico.ead.domain.repository.academico.TopicoRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class TopicoService extends BaseService<Topico> {
private final TopicoRepository repository;
private final TopicoValidator validator;
private final GetSecurityData securityData;
@Override
protected BaseRepository<Topico> getRepository() {
return repository;
}
@Override
protected BaseValidator<Topico> getValidator() {
return validator;
}
@Override
protected GetSecurityData getSecurityData() {
return securityData;
}
}
Service com Regras Específicas
Para cenários que exigem regras específicas ou gestão de relacionamentos complexos, o service pode incluir lógicas adicionais. Isso permite personalizar o comportamento padrão para atender necessidades específicas do domínio ou da aplicação:
package com.webpublico.ead.application.service.academico;
import br.com.archbase.security.usecase.GetSecurityData;
import com.webpublico.ead.application.exception.ErroGenericoException;
import com.webpublico.ead.application.service.BaseService;
import com.webpublico.ead.application.validator.BaseValidator;
import com.webpublico.ead.application.validator.academico.TopicoValidator;
import com.webpublico.ead.domain.model.academico.Topico;
import com.webpublico.ead.domain.repository.academico.TopicoRepository;
import com.webpublico.ead.infrastructure.adapter.persistence.exception.PersistenceException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class TopicoService extends BaseService<Topico> {
public static final String ERRO_PERSISTENCIA = "Erro ao salvar o tópico devido a problemas de persistência.";
private final TopicoRepository repository;
private final TopicoValidator validator;
private final GetSecurityData securityData;
@Override
public Topico salvar(Topico topico) {
try {
associarTopicoSuperior(topico);
return super.salvar(topico);
} catch (PersistenceException e) {
throw new ErroGenericoException(ERRO_PERSISTENCIA, e);
}
}
private void associarTopicoSuperior(Topico topico) {
String superiorId = topico.getNivelAnteriorTopicoId();
if (superiorId != null) {
topico.setNivelAnteriorTopicoId(superiorId);
}
}
@Override
protected BaseRepository<Topico> getRepository() {
return repository;
}
@Override
protected BaseValidator<Topico> getValidator() {
return validator;
}
@Override
protected GetSecurityData getSecurityData() {
return securityData;
}
}
Notas sobre a Implementação
-
Validator: Se o service herda de
BaseService, é necessário implementar umBaseValidatorpara garantir que as entradas sejam validadas antes de executar operações de persistência. Mesmo para serviços que não utilizam a herança deBaseService, é recomendado implementar validadores para manter a integridade dos dados. -
GetSecurityData: É crucial para garantir a rastreabilidade das operações, registrando quem criou ou modificou os registros. Sua utilização é obrigatória, independente da herança de
BaseService, para assegurar a auditoria das ações realizadas.