关于在 Service 中调用 Service 是否符合最佳实践? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ByteCat
V2EX    Java

关于在 Service 中调用 Service 是否符合最佳实践?

  •  
  •   ByteCat 2020-02-07 14:52:54 +08:00 5653 次点击
    这是一个创建于 2097 天前的主题,其中的信息可能已经有所发展或是发生改变。
    自己在学习 Spring Boot 的开发,最近使用到了 MyBatis Plus 这个包,它有自带通用 Mapper 和 通用 Service。

    那么,如果我在自己的 Service 中去调用其通用 Service 是否符合最佳实践,还是说以 Service 调用 DAO 为更好的选择?
    9 条回复    2020-02-14 18:15:45 +08:00
    abcbuzhiming
        1
    abcbuzhiming  
       2020-02-07 16:27:57 +08:00
    没有事务问题时,你可以这么做,有事务的时候你要当心事务传递失效问题。一般情况下有事务的情况我都是自建一个 service 然后调用多个 dao 来完成事务,代码会有冗余,但是足够安全,而且业务隔离,不会影响到其他
    mr253727942
        2
    mr253727942  
       2020-02-07 17:11:08 +08:00
    @abcbuzhiming 为何会失效呢
    mreasonyang
        3
    mreasonyang  
       2020-02-08 02:15:07 +08:00
    可以再抽象出一个仓储层或应用服务层
    CStarter
        4
    CStarter  
       2020-02-08 08:49:25 +08:00 via Android
    我们公司的不允许 service 调用其它 dao
    mmdsun
        5
    mmdsun  
       2020-02-08 13:20:25 +08:00 via Android
    service 调 service 可以接受。调 dao 不推荐
    gundam0603
        6
    gundam0603  
       2020-02-08 16:30:16 +08:00   1
    service 调 service 可能会有 循环引用的问题,当然用延迟加载就没事,不过总觉得少优雅。。。。
    那个事务传递失败的话 ,service 调 service 不会有问题,有问题的是调用 this ,自调用的时候不走代理类。
    新版本的 spring 支持注入本类,可以注入本类来走代理类。
    感觉最规范的方法可能是 service 上再加一层,不过复杂了。
    service 调 service 也可以用,就是要注意循环的问题.
    mysunshinedreams
        7
    mysunshinedreams  
       2020-02-09 12:40:11 +08:00
    service 调用 service 分好层就还好。
    Aresxue
        8
    Aresxue  
       2020-02-11 09:39:51 +08:00
    从设计模式的单一职责原则来说不建议 service 的互相调用,相似的业务也应该由多个 Dao 重新组合完成实际业务,但是这样会带来大量冗余,好处是各个 service 完全独立没有相互耦合。相对的 service 互相调用则可以使得代码更为简洁业务上的相关性也体现在了代码上,在需要修改时只需要修改被依赖的 service,在重构时有很大的作用。业界对于耦合十分厌恶,比较互联网项目基本都拆除了外键,所以 service 只调用 dao 是一种更严谨的方式,service 之前的相互依赖一旦随着项目推进逐渐增多就会变成项目的负债让项目的推进越来越难。如果项目中没有严格规定的话,要考虑好两个 service 所对应的顶层业务是否需要这种关联性,需要则 service 调用 service,不然还是调用 dao 重新组合业务好了(这种方式调优时也有明显优势)。
    340244120w
        9
    340244120w  
       2020-02-14 18:15:45 +08:00 via iPhone
    当然可以,而且很多时候也应该这样,不要为了设计模式而设计模式。

    至于楼上说的缺点,spring 的依赖注入还是能处理 bean 之间的彼此依赖的;spring 也提供了事务传播控制的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1497 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 16:39 PVG 00:39 LAX 08:39 JFK 11:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86