Intégration de l'architecture hexagonale dans un projet Quarkus avec des exemples Java
L'architecture hexagonale, également connue sous le nom de portes et adaptateurs ou architecture en oignon, est un modèle de conception logicielle qui favorise la séparation des préoccupations et la facilité de testabilité. En mettant l'accent sur la dépendance inverse, elle permet de créer des systèmes hautement modulaires et évolutifs. Dans cet article, nous explorerons comment intégrer l'architecture hexagonale dans un projet Quarkus en utilisant des exemples concrets en Java.
Comprendre l'architecture hexagonale
L'architecture hexagonale repose sur le principe de séparation des préoccupations en divisant l'application en trois couches principales : le domaine, les adaptateurs et l'infrastructure.
- Le domaine représente le cœur métier de l'application, il contient les entités, les règles métier et les services.
- Les adaptateurs, également appelés ports, sont les points d'entrée et de sortie de l'application. Ils permettent d'interagir avec le domaine en fournissant des interfaces pour les entrées (ports primaires) et les sorties (ports secondaires).
- L'infrastructure est responsable de la mise en œuvre des adaptateurs. Elle comprend les bases de données, les API externes, les frameworks, etc.
Intégration de l'architecture hexagonale dans Quarkus
Quarkus est un framework Java open source conçu pour créer des applications cloud natives. Il offre une prise en charge de premier ordre pour les conteneurs, la réactivité et le développement rapide. Intégrer l'architecture hexagonale dans un projet Quarkus peut être réalisé en suivant quelques principes de conception simples.
Création du domaine
Commençons par définir le domaine de notre application. Supposons que nous construisons une application de gestion de tâches. Nous pouvons avoir des entités telles que Task
, User
, et des services comme TaskService
qui implémentent la logique métier.
public class Task {
private String id;
private String title;
private boolean completed;
// Getters and setters
}
public interface TaskService {
Task createTask(String title);
Task markTaskAsCompleted(String taskId);
List<Task> getAllTasks();
// Other business methods
}
Implémentation des adaptateurs
Les adaptateurs fournissent des interfaces pour interagir avec le domaine. Dans notre exemple, nous pourrions avoir des adaptateurs pour interagir avec une base de données, une API REST, ou toute autre source de données.
@ApplicationScoped
public class TaskRepository implements TaskService {
@Transactional
public Task createTask(String title) {
// Logic to persist task in database
}
@Transactional
public Task markTaskAsCompleted(String taskId) {
// Logic to mark task as completed in database
}
@Transactional
public List<Task> getAllTasks() {
// Logic to retrieve all tasks from database
}
// Other database interactions
}
Configuration de l'infrastructure
Dans Quarkus, la configuration de l'infrastructure peut être réalisée en utilisant les fonctionnalités natives de Quarkus pour la persistance des données, les appels REST, etc.
@QuarkusTest
public class TaskResourceTest {
@Inject
TaskService taskService;
@Test
public void testCreateTask() {
// Test logic to create task via REST API
}
@Test
public void testMarkTaskAsCompleted() {
// Test logic to mark task as completed via REST API
}
@Test
public void testGetAllTasks() {
// Test logic to get all tasks via REST API
}
}
Conclusion
En utilisant l'architecture hexagonale dans un projet Quarkus, nous pouvons créer des applications bien structurées, modulaires et faciles à tester. En séparant clairement le domaine des adaptateurs et de l'infrastructure, nous obtenons une meilleure maintenabilité et évolutivité de notre code. En combinant la flexibilité de Quarkus avec les principes de conception solides de l'architecture hexagonale, nous pouvons construire des applications Java robustes pour répondre aux besoins métier les plus exigeants.