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.所以这样的方式有没有好一点的方式进行处理,不用写这么多的判断。
다오 이름을 앞단에서 반복하지 않고 리플렉션을 통해 다오 레이어를 호출하는 것이 좋을 것 같습니다.
그냥 아이디어일 뿐입니다.
귀하의 질문에는 이미 '묻지 마세요', '확실히' 등의 긍정문이 여러 개 포함되어 있어 다른 말씀을 드리기가 어렵습니다. 플래그 값을 기반으로 해당 dao 인스턴스를 얻기 위해 팩토리 모드나 관리자 모드를 시도할 수 있습니다(실제로는 이 보기 흉한 코드를 어두운 구석으로 옮기면 됩니다).
다형성 또는 테이블 기반 모드(코드 컬렉션 18장 참조)
분명히 디자인 문제이고 아직은 좀 고집스럽네요
프로젝트 구조 문제. 자바의 특징을 생각해 보세요. 캡슐화. 상속 다형성
인젝션이라는 단어를 언급했으므로 Spring 프레임워크를 사용하고 있다고 가정하고 Spring의 applicationContext는 컨테이너에 의해 초기화된 모든 Bean을 얻을 수 있습니다. 일반적으로 프레임워크에는 BaseDao와 같은 데이터 액세스 계층 추상화가 있습니다. , 그런 다음 baseDao=applicationContext.getBean("beanName")을 사용하고 원하는 대로 수행할 수 있습니다
지도를 만들겠습니다
map.put("dao1",dao1);
map.put("dao2",dao2);
map.put("dao3",dao3);
그런 다음 페이지의 매개변수를 통해 지도의 키를 선택하고 dao를 가져옵니다
물론 spring을 사용하는 경우 이 지도를 spring xml에서 직접 구성할 수 있습니다
if else와 switch case 문 모두 명령 모드를 사용하여 재구성할 수 있다는 것을 기억합니다
으아악그러면 컨트롤 레이어는 servicecontrol을 직접 사용할 수 있습니다. 이러한 방식으로 컨트롤 레이어는 dao에서 분리되고 양쪽 수정 사항은 서로 영향을 주지 않으며 xml을 통해 조정됩니다.