1.项目背景
一个controller,一个serivce,多个dao层
service里面更具用户的不同参数调用不同的dao进行实例化,时候在调用方法。
2.不要问为什么设计,那是因为一个模块对应37张表,用户根据下拉选择输入不同的表单(说白点,点击页面新增弹出下拉框,让用户选择填写那张表单,再来一句,各个表之间没有相同的字段),所以此模块肯定是一个controller,一个service,各个dao对应不同的表进行增删改查操作
3.所以在service层必然有一个语句需要判断实例化那个dao,用注入也行
if(flag == dao1){
}else if(flag == dao2){
}else if(flag == dao3){
}else if(flag == dao4){
}else if(flag == dao5){
}else if(flag == dao6){
}
........就要写25个(不管是switch还是if都避免不了)
4.所以这样的方式有没有好一点的方式进行处理,不用写这么多的判断。
Je pense qu'il devrait être bon d'appeler la couche Dao par réflexion sans répéter le nom du dao depuis le début
C'est juste une idée ;
Comme votre question contient déjà plusieurs phrases affirmatives telles que « ne demandez pas » et « définitivement », il est difficile de dire autre chose. Vous pouvez essayer le mode usine ou le mode gestionnaire pour obtenir l'instance dao correspondante en fonction de la valeur de l'indicateur (en fait, vous déplacez simplement ce code laid vers un coin sombre).
Polymorphisme, ou mode piloté par table (voir le chapitre 18 de la Collection de codes)
C'est évidemment un problème de conception, c'est quand même un peu tenace
Problèmes de structure du projet. Pensez aux caractéristiques de Java. Encapsulation. Polymorphisme héréditaire
Depuis que vous avez mentionné le mot injection, je suppose que vous utilisez le framework Spring et que l'applicationContext de Spring peut récupérer tous les beans qui ont été initialisés par le conteneur. Il existe généralement une abstraction de couche d'accès aux données telle que BaseDao dans le framework. , alors vous pouvez utiliser baseDao=applicationContext.getBean("beanName") puis faire ce que vous voulez
Je vais construire une map
map.put("dao1",dao1);
map.put("dao2",dao2);
map.put("dao3",dao3);
Sélectionnez ensuite la clé de la carte à travers les paramètres de la page et obtenez le dao
Bien entendu, si vous utilisez spring, cette carte peut être configurée directement dans spring xml
Je me souviens que les instructions if else et switch case peuvent être reconstruites en utilisant le mode commande
Ensuite, la couche de contrôle peut utiliser directement servicecontrol. De cette façon, la couche de contrôle est découplée du dao, et les modifications des deux côtés ne s'affectent pas et sont coordonnées via XML