Modèle de conception de DAO
Donc disons que nous avons un couple d'entités que nous voulons persistent à l'aide d'objets DAO. Nous avons donc mettre en œuvre le droit de l'interface de sorte que nous nous retrouvons avec
class JdbcUserDao implements UserDao{
//...
}
class JdbcAddressDao implements AddressDao{
//...
}
Donc, si je veux être en mesure de passer de la persistance des implémentations de JDBC pour JPA (par exemple) et vice-versa, j'aurais besoin d'avoir JPAUserDao et JPAAddressDao... ce qui veut dire que si j'avais 20 entités, et a décidé de passer implémentations(à l'aide de DI conteneur), j'aimerais avoir à passer chaque Jdbc mise en œuvre avec JPA dans le code.
Maintenant, il se pourrait que j'ai mal compris comment DAO fonctionne, mais... Si j'ai juste eu
class JdbcDaoImpl implements UserDao,AddressDao{
//...
}
J'avais alors tous les JDBC mises en œuvre dans une classe, de commutation et d'implémentations serait un morceau de gâteau. Aussi, DaoImpl nombre est égal au nombre d'interfaces Dao. Pourquoi ne pas simplement groupe par la mise en œuvre (jdbc, JTA, JPA...) et tout ce qui est sous classe?
Merci d'avance.
main()
méthode: la séparation des préoccupations. (Btw, personne ne vous empêche de codage d'un résumé JdbcDaoBase
contenant le code commun et l'extension que dans votre Dao
')Pourquoi devrait-il être plus facile de remplacer les méthodes de 500 à 1 classe que dans 100 classes?
OriginalL'auteur Mercurial | 2012-03-31
Vous devez vous connecter pour publier un commentaire.
Avoir une classe unique de mettre en œuvre chaque interface DAO dans l'ensemble de votre application serait plutôt mauvaise conception.
Plus modèle typique est d'avoir un
BaseDAO
interface (souvent aussi appeléGenericDAO
) et ont unJPABaseDAO
,JDBCBaseDAO
etc. Ces classes de base contiendra des méthodes comme trouver/obtenir/de lire, de sauvegarder/store/persistent, mettre à jour/modifier et supprimer/supprimer/purge.Spécifiques interfaces DAO comme
UserDAO
alors hériter deBaseDAO
et des implémentations concrètes commeJPAUserDAO
s'étend deJPABaseDAO
.Un
BaseDAO
interface pourrait ressembler à ceci:Et un
UserDAO
interface:Bare bones exemple de
JPABaseDAO
la mise en œuvre de cette interface:Et quelques exemples de
UserDAO
de mise en œuvre qui allait hériter de lui:Dans la pratique de la classe de base peut souvent faire d'autres choses d'une manière transparente, par exemple en vérifiant si une entité met en œuvre une sorte de
Auditable
interface, et automatiquement le réglage de la date et de l'utilisateur qui l'a modifié, etc.Lors de l'utilisation d'EJB pour mettre en œuvre votre DAOs, une stratégie pour changer implémentations serait de mettre tous JDBC implémentations dans un seul paquet et toutes les implémentations JPA dans l'autre. Puis il suffit de comprendre qu'un seul paquet de mise en œuvre dans votre construction.
CRUD ou que ce soit les opérations impliquant plusieurs entités/tables sont souvent prises en charge par des Services d'agréger plusieurs DAOs. Dans EJB vous serez automatiquement dans le même contexte de persistance, même si vous appelez plusieurs DAOs (il se propage). Une autre possibilité est que si des entités sont associées (l'Utilisateur a-une Maison de), vous avez seulement besoin d'un DAO pour un Utilisateur et JPA va télécharger/enregistrer/mettre à jour les maisons automatiquement à partir de vos objets Utilisateur.
Ouais sympa. Cette approche est celle que j'ai suivie dans divers projets. Il a prouvé à travailler très bien et stable. - Je le décrire en détail ici: codeblock.engio.net/?p=180
OriginalL'auteur Arjan Tijms
Le point de l'ensemble de l'Injection de Dépendance est de faire de la commutation entre la mise en œuvre plus facile et le découplage de l'utilisateur par le fournisseur. Par conséquent, tous les DI cadres de prévoir un moyen de "groupe" plusieurs implémentations (ici votre JDBC-groupe et votre JPA-groupe) et de les transférer dans un seul endroit.
Aussi: Généralement, le nombre de consommateurs (dans votre cas: un peu de logique métier de travail sur les utilisateurs et les adresses) est généralement plus élevé que le nombre de DAOs le DI-cadre sera dételer la plupart des choses pour vous de toute façon. Supposons: 50 entreprises les haricots, les deux interfaces et deux implémentations pour chaque interface (4 au total): même base DI prend en charge pour le 50. À l'aide de regroupement permettra de réduire de moitié que le reste pour vous.
J'aimerais bien, mais je ne sais pas ce n'est pas claire.
"même base DI prend en charge pour le 50. À l'aide de regroupement permettra de réduire de moitié que le reste pour vous." - Je n'arrive pas à comprendre cela.
Auparavant j'ai fait un exemple typique: Vous avez beaucoup d'affaires haricots (p. 50). Chaque entreprise bean généralement référence à plusieurs DAOs de déléguer la persistance de travail. Dans ce lieu DI est le premier GRAND helper: la gestion de l'50 ou plus de dépendances dans un endroit central - DI-config. Si votre préoccupation initiale de commutation de 20 DAO implémentations est beaucoup plus facile à l'aide de DI, parce que ces 20 variations seraient dans un lieu - à la DI fichier de config (contre 50 lieux que sans DI). Sur le dessus de cela (c'est à dire pour rendre les choses encore plus facile) DI cadres habituellement fournir un autre groupe de choses.
OriginalL'auteur A.H.
Il y a certainement des possibilités pour mettre en œuvre le DAO de motif dans un largement de la technologie de façon agnostique, telles que la commutation de la technologie de persistance ou encore un mélange de plusieurs technologies devient possible. Cet article présente un plan de mise en œuvre, y compris le code source sur github.
http://codeblock.engio.net/?p=180
OriginalL'auteur bennidi