亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在MVC開發模式中,封裝對象應該放在Controller還是Service?Controller與Service應該如何交互?

在MVC開發模式中,封裝對象應該放在Controller還是Service?Controller與Service應該如何交互?

哆啦的時光機 2019-03-01 11:02:57
已經學了兩年的MVC了,但是有些概念還是很模糊,希望能在這里尋找到答案。 我曾經看到有人說Controller不負責數據處理,全部交給我們的Service來處理,網頁前端傳回來是什么數據類型,就直接把數據類型轉發到Service,然后由Service來處理;但是又有另外一種聲音說有時候會同時調用多個Service,如果在Controller就將對象封裝好了,就免于在Service的方法中多次封裝。 另外還有一個問題就是關于Controller與Service的交互問題。我們為了前端的客戶交互良好,往往會通過Controller向前端返回一些錯誤提示,比如用戶名已存在,用戶名和密碼不匹配等等??墒翘幚順I務邏輯我們是放在Service層,那么如果把一個login(String username,String password)方法的返回值設定為boolean就無法返回多種錯誤,但是如果返回String類型,就需要設定一些基本的字典。我自己“奇思妙想”,我在Service中通過拋出我自定義的一些RuntimeException,然后在Controller中通過TryCatch來處理不同的錯誤,但是我自己認為這種拋出異常的方式不妥。最近就陷入了迷茫,馬上就要開始做下一個項目了。希望各位能幫我解答一下迷惑。 感謝。
查看完整描述

8 回答

?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

我覺得Controller不負責處理數據是正確的, 因為在spring-mvcController是不能復用的, 但是如果你把業務邏輯抽象成Service, 那么這個Service就是可以復用的.

至于你說的 "在Controller就將對象封裝好了,就免于在Service的方法中多次封裝" , 沒太明白什么意思, 你每個Service需要什么參數, Controller就給什么參數, 至于需要的參數是否需要封裝成對象就可以自己權衡了.

你所說的login(String username,String password), 你想抽象成Service用異常處理處理多種不同的結果, 這個我覺得完全沒有問題, 而且我覺得非常好啊, 很多認證框架都用的這種方式, 至少我看的apache-shiro就是用異常處理認證失敗的不同情況的.

查看完整回答
反對 回復 2019-03-01
?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

第一個問題感覺沒有標準答案,具體情況具體分析,邏輯分層清晰易于維護就好。

第二個問題的話,你這里給出的交互是隸屬于權限控制的,一般用filter、aop、代理、反射等等方式實現代碼收束都可以,異常也在這些集中控制的代碼里扔一次就好,直接在Controller里硬編碼我反倒覺得累贅。Service這一層更多的是調用Dao層的方法來實現一些復雜的涉及多表的業務邏輯處理,事務也放在這一層(當然現在框架把這事兒都干了),所以Service這一層一般不扔異常(參數驗證在Controller以及之前的層次都做掉了因此不出現業務相關異常,而Dao把數據庫相關的底層異常屏蔽了)。

當然這是個人看法,沒有定式,還是那句話,分層清晰易于維護就好。

查看完整回答
反對 回復 2019-03-01
?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

1、Controller默認是單例的,但可用@Scope(value = "prototype")替換

2、登錄可以返回int啊,自己加個枚舉

3、規定是在Service層處理邏輯,要看業務的吧,代碼冗余度低些好,也好優化

大家觀點會不同,做開發更多的還是優化改,降低冗余度,而不是必須要怎么做。。。

查看完整回答
反對 回復 2019-03-01
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

1,Controller應盡可能的不設計業務邏輯,只涉及交互
2,Service為可復用的業務邏輯
3,Controller為Service的上級調用方
4,你這個case可以在Service中返回固定的返回值,在Controller層做判斷,并拋出你想相應的異常。

當然了這只是我們目前的做法,分享一下。。。

查看完整回答
反對 回復 2019-03-01
?
婷婷同學_

TA貢獻1844條經驗 獲得超8個贊

封裝對象到底在Controller還是Service,還是要看具體的情況,個人認為如果是簡單的參數在Controller中進行封裝時是完全可以的,如果放到Service反而會顯得很冗余,而且導致Service通用性變差;對于第二個問題,不容同意通過枚舉或者不同的狀態碼來在Controller左做判斷拋出異常,完全可以自己定義一套異常處理機制,直接在Service層拋出,項目有針對此類業務異常的處理機制,直接兩將Service的錯誤信息和錯誤碼返回到View層,讓客戶端根據狀態碼和錯誤信息作處理

查看完整回答
反對 回復 2019-03-01
  • 8 回答
  • 0 關注
  • 1513 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號