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.所以这样的方式有没有好一点的方式进行处理,不用写这么多的判断。
黄舟2017-04-17 17:41:01
あなたの質問にはすでに「聞かないでください」「間違いなく」などの肯定文がいくつか含まれているため、他に何も言うことができません。ファクトリ モードまたはマネージャー モードを試して、フラグ値に基づいて対応する dao インスタンスを取得できます (実際には、この醜いコードを暗い隅に移動するだけです)。
迷茫2017-04-17 17:41:01
インジェクションという言葉について言及したので、Spring フレームワークを使用していると思います。Spring の applicationContext は、コンテナによって初期化されたすべての Bean を取得できます。通常、フレームワークには BaseDao などのデータ アクセス層の抽象化があります。次に、baseDao=applicationContext.getBean("beanName") を使用して、必要なことを実行できます
巴扎黑2017-04-17 17:41:01
マップを構築します
map.put("dao1",dao1);
map.put("dao2",dao2);
map.put("dao3",dao3);
次に、ページのパラメータを通じてマップのキーを選択し、dao を取得します
もちろん、Spring を使用している場合、このマップは Spring XML で直接設定できます
PHPz2017-04-17 17:41:01
if else ステートメントと switch case ステートメントはどちらもコマンド モードを使用して再構築できることを覚えています
リーリーその後、制御層は servicecontrol を直接使用できます。このようにして、制御層は dao から分離され、両側の変更は相互に影響せず、xml を通じて調整されます。