经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
领域驱动设计-从贫血模型到充血模型
来源:cnblogs  作者:UP技术控  时间:2021/1/25 11:14:05  对本文有异议

背景

领域模型对象只是用来存储应用的数据。业务逻辑位于服务层中,管理域对象的数据。在服务层中,应用的每个实体对应一个服务类。这种模式大家是不是很熟悉,尤其是在中小项目或者项目刚启动的时候,都是怎么方便怎么来;没错,这就是贫血模型。

一般画风是这样的。

1、Web层:接收用户输入,将数据传至服务层;

2、服务层:处理业务逻辑、权限管理与授权,并与存储层通信;

  1. using BQoolCommon.Interface.Repository.Dapper;
  2. using BQoolCommon.Interface.Service;
  3. using BQoolCommon.Models.BQoolCommon_SetMain;
  4. using BQoolCommon.Models.Enum;
  5. using BQoolCommon.Models.ViewModel;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Configuration;
  9. namespace BQoolCommon.Service
  10. {
  11. public class UserPermissionService : IUserPermissionService
  12. {
  13. private readonly IInnerSiteMapDapperRep _innerSiteMapDapperRep;
  14. private readonly IInnerSiteMapService _innerSiteMapService;
  15. private readonly IAccountChannelRelService _accountChannelRelService;
  16. private readonly IUserMgmtService _userMgmtService;
  17. public UserPermissionService(
  18. IInnerSiteMapDapperRep innerSiteMapDapperRep,
  19. IInnerSiteMapService innerSiteMapService,
  20. IAccountChannelRelService accountChannelRelService,
  21. IUserMgmtService userMgmtService)
  22. {
  23. _innerSiteMapDapperRep = innerSiteMapDapperRep;
  24. _innerSiteMapService = innerSiteMapService;
  25. _accountChannelRelService = accountChannelRelService;
  26. _userMgmtService = userMgmtService;
  27. }
  28. .................................................

3、存储层:与数据库进行通信,对数据进行持久化;

  1. using System.Linq;
  2. using BQoolCommon.Interface.Factory;
  3. using BQoolCommon.Interface.Repository.Entity;
  4. using BQoolCommon.Models.BQoolCommon_SetMain;
  5. using BQoolCommon.Models.ViewModel;
  6. namespace BQoolCommon.Repository.Entity
  7. {
  8. public class WeChatSubscribeEntityRep : GenericEntityRep<WeChat_Subscribe>, IWeChatSubscribeEntityRep
  9. {
  10. public WeChatSubscribeEntityRep(IBqoolSetMainDbContextFactory factory) : base(factory)
  11. {
  12. }
  13. }
  14. }

问题窥探

问题出在了服务层,他承受了太多的职责,像业务逻辑、权限检查等等,这违反了单一职责原则,并产生了大量的依赖。当业务复杂度上升时,服务层所包含的代码将会非常庞大和复杂。服务层需要包含应用逻辑、用户会话的管理;领域层应该包含业务逻辑,可以处理与业务相关的会话状态。

改进思路

我们需要将业务逻辑从服务层移动到领域模型中,这样的好处是,服务层可以只负责应用逻辑(如数据有效性验证、授权检查、开始结束事务等),领域模型可以专门负责其相关的业务逻辑。以电商系统来举例,架构设计时完全可以针对订单、商品、库存等多个领域模型进行建模,相关的业务可以分别放到不同的领域模型中,一些很有可能重复的业务代码都会被集中到一处,从而降低了复制-粘贴的可能性,这就是充血模型。

影响

充血模型将服务类变得更小,使之只负责单一的职责。例如商品的CRUD和其他操作,就可以将其放到两个不同的服务类中,一个负责商品的CRUD操作,另外一个负责与商品相关的其他操作。这样就能使服务类变得小巧、松散、可测试了,同时还能降低其他人理解与重用的成本。

总结

1、从规范和长远来看肯定是充血模型合适些。

2、但是如果只是小项目、求快的话,当然是开发成本低的贫血模型。

原文链接:http://www.cnblogs.com/lyl6796910/p/14323645.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号