Quels sont quelques exemples de bonnes structures de classe utilisées pour gérer l'accès à la base de données? Je suis un fan de l'encapsulation de classe et je préférerais que les conteneurs (par exemple la voiture) n'effectuent pas de tâches de base de données.
J'aimerais également pouvoir déposer facilement des éléments comme un cache de base de données à l'avenir.
Je prends souvent le modèle des classes de conteneur, avec des getters et setters pour la validation et l'accès à la base de données effectués par une seule classe singleton. Cela étant dit, cela se mélange souvent entre les deux et devient assez déroutant.
Désolé si ma question est difficile à comprendre; Je ne suis pas absolument sûr des conditions concernant les bases de données. N'hésitez pas à demander des éclaircissements si nécessaire.
Réponses:
Je préfère le modèle de référentiel pour encapsuler l'accès aux données. En bref, le référentiel est responsable du chargement de toutes les données requises pour un objet spécifique. Disons que vous avez un objet Car, comme dans votre exemple. Mais tous les attributs de la voiture, de la marque, du modèle, de l'année, des propriétaires, des fonctionnalités (lecteur CD, 4x4, etc.) sont stockés dans diverses tables de la base de données. Le référentiel détermine comment charger et enregistrer les données. Si plusieurs requêtes plus petites sont nécessaires, très bien, mais seul le modèle de référentiel doit le savoir. La couche de service appelant le référentiel n'a besoin que de savoir quel référentiel appeler.
Cela peut ensuite être combiné avec l' unité de travail . Ainsi, dans votre exemple, la couche de service dirait qu'elle doit charger une entité de voiture, elle a une sorte d'identifiant unique et envoie cet identifiant vers le référentiel. Le référentiel renvoie l'entité car. Un autre code manipule l'entité car et renvoie cette entité au référentiel afin qu'elle puisse être enregistrée.
Si vous voulez vraiment tout mettre en œuvre, la couche de référentiel exposerait uniquement les interfaces, telles que ICarRepository. Le référentiel contiendrait une fabrique que la couche de service utiliserait pour obtenir l'interface ICarRepository. Tout accès à la base de données serait caché derrière une interface, ce qui rend les tests unitaires beaucoup plus faciles.
la source
J'ai utilisé le modèle de stratégie pour encapsuler l'accès aux données. Ce modèle vous permet de masquer le type de stockage que vous utilisez derrière une interface commune. Dans l'interface, définissez vos méthodes d'accès aux données sans tenir compte du type de stockage (fichier, base de données, web). Ensuite, pour votre choix de stockage actuel, dans une classe réalisant l'interface de stratégie, implémentez les détails d'accès aux données. De cette façon, votre application ne se soucie pas de la source de données que vous utilisez.
Vous pouvez également créer une couche de service qui utilise l'instance de stratégie de stockage de données actuelle pour définir des détails plus spécifiques à l'application au lieu de mélanger l'accès aux données et la logique métier.
la source
Ceci est un exemple de modèle Factory de base de données;
la source