[请益] MVC新手请教..

楼主: a88241050 (再回頭已是百殘身)   2019-05-31 16:02:02
最近工作上刚写了一支程式
当整个程式流程跑完
我总共需要insert和update7个table
然后我每次对table做操作都会透过ajax传
json物件呼叫controller的方法
每个controller再调用service的insert或update
所以我一个流程就会发送7次ajax需求呼叫controller
现在程式写完遇到两个问题
一个是程式执行时间有点久..
一个是若程式出错没办法把资料还原
后来有人告诉我我应该把全部流程包在一个controller的方法里
请问这样就能解决了吗?
还是应该写在service里?
作者: cz75 (诀别的九月)   2019-05-31 16:19:00
小弟也是菜鸡,提供一下我的想法,第一点互相没有影响的table也许可以用异步提高效率?第二点不晓得用transaction scope包起来有没有用
作者: DCTmaybe (竹竹人)   2019-05-31 16:46:00
你流程的每一步都会影响到下一步吗?可以讲详细一点
作者: lwtech   2019-05-31 16:47:00
呼叫七个是将逻辑切干净,你现在要呼叫七个就看你要在前端封装还是后端都可以,另外服务和controller应该是不一样的东西,很类似但服务是controller的封装层db慢你要自己会用工具看效能的部分,通常设定可以解决
作者: vi000246 (Vi)   2019-05-31 17:20:00
google sql transaction
作者: lwtech   2019-05-31 17:22:00
ajax 是 异步...
作者: asdasdasd80 (会计去死)   2019-05-31 18:03:00
前面都先暂存,等最后步骤再一起写进DB行吗
作者: chocopie (好吃的巧克力派 :))   2019-05-31 18:06:00
DB不要太频繁写入,不然日后还要再做优化,多一次工
作者: pilor (Formosa)   2019-05-31 18:07:00
db 写交易
作者: DCTmaybe (竹竹人)   2019-05-31 18:08:00
听起来是要包transaction,但七次操作是分开的,可以先在前端暂存最后才打ajax吗?或是你要另外开一张暂存的db来储存这些操作的结果,最后才一次写入到要存的table
作者: puring0815   2019-05-31 18:48:00
有点模糊,每个步骤会依上个步骤结果有不同商业逻辑吗?出错就要还原,那出错的定义是什么?有可能只存四个资料表但是是代表成功?还是说要嘛没资料要嘛七个表都有资料?
作者: pathy (pathy)   2019-05-31 18:50:00
如果7次的操作是有相关性的,那用一次ajax比较合理另外如果第三步执行失败,前面已经执行过的两步改动要复原的话,整个7次操作要用transaction包起来,自己查下transaction的用法吧
作者: lazarus1121 (...)   2019-05-31 19:48:00
应该1次发送,后端1次跑7个模组吧
作者: eateat33 (33来吃)   2019-05-31 19:56:00
整包包起来
作者: puring0815   2019-05-31 20:10:00
也同意可以先试试用包同一包ajax并用transaction处理
作者: forewero (木日一)   2019-05-31 20:18:00
1次Request,7次操作比较合理,然后AP or db做transaction
作者: lwtech   2019-05-31 20:21:00
ajax 有 async,await, 七个你错哪一个你要去db 看...async 里的 sync,没 es6+ 就用 polyfill when,promise.
作者: clamperni (肥宅牛牛)   2019-05-31 20:33:00
M_V_C
作者: SHANGOYANYI (彦一)   2019-05-31 21:05:00
从你的描述看起来 这7张表的操作是属于“一个交易”所以发一个ajax去后端做整包的处理会比较好做 (失败处理透过orm的transaction机制rollback即可)
作者: ashlikewing   2019-05-31 21:15:00
这和MVC没什么关系,你没有搞清楚程式流程的主要目的
作者: vi000246 (Vi)   2019-05-31 22:29:00
主要是你的流程要做什么 不是这做法普不普遍像有些网站的setting不需要存盘 只要更新就自动存盘就会有改一个字段就call一次api的做法但你又要还原rollback 就像一次更新整个form的七个字段call七次 一次失败就不存盘 那你可以直接改成一次送出整个form 不用分七次request 就逻辑设计的问题
作者: googoo1102 (googoo)   2019-05-31 22:53:00
总之送7次肯定是不好的写法
作者: lwtech   2019-05-31 23:13:00
不然这样好了,我们九点开盘,九点零一收盘,大家节省时间
作者: vi000246 (Vi)   2019-06-01 00:37:00
执行时间你可以开浏览器的F12看 如果是等response的时间太长 可能是后端有问题
作者: sxy67230 (charlesgg)   2019-06-01 01:50:00
理论上,不要去让View处理太复杂的逻辑,正确的作法都是把商业逻辑封装在service里面,controller不做逻辑,只负责流程控制。最后,善用sql语法、必要的时候做index加速query、大量资料记得用sql做分页,否则你会写出很肥的逻辑,人家一行就搞定了。
作者: iansrc (Ian)   2019-06-01 10:49:00
应该是一个方法包起来吧,在 API 里呼叫方法,AJAX 只要叫一次 API 就好。用 transaction 包那些 SQL (或是ORM) 语法,出错就会还原了
作者: johnny4753 (Li)   2019-06-01 12:44:00
如果是用entityframework的话,只需呼叫一次SaveChange()就帮你搞定rollback问题了
作者: lwtech   2019-06-01 15:44:00
学点工具做后端流程监控吧.服务就是控制器的封装...https://tinyurl.com/yyy33may
作者: reichs   2019-06-01 18:56:00
写一个stored procedure处理这7张table.
作者: DendiQ (貔貅)   2019-06-01 21:39:00
我猜你是不是把所有 db sql 操作都写在 client...?
作者: ian90911 (xopowo)   2019-06-02 13:03:00
asp.net MVC 要特别写出来
作者: beau03 (beau)   2019-06-02 16:05:00
各阶段用cookie将值加密暂存,最后再将cookie送后端或ajax使用者如prev上一步,直接由cookie复原画面字段值
作者: blackie1019 (blackie)   2019-06-04 00:22:00
看一下Saga pattern 可以救你很多

Links booklink

Contact Us: admin [ a t ] ucptt.com