zoukankan      html  css  js  c++  java
  • 领域驱动设计-从贫血模型到充血模型

    背景

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

    一般画风是这样的。

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

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

    using BQoolCommon.Interface.Repository.Dapper;
    using BQoolCommon.Interface.Service;
    using BQoolCommon.Models.BQoolCommon_SetMain;
    using BQoolCommon.Models.Enum;
    using BQoolCommon.Models.ViewModel;
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    
    namespace BQoolCommon.Service
    {
        public class UserPermissionService : IUserPermissionService
        {
            private readonly IInnerSiteMapDapperRep _innerSiteMapDapperRep;
    
            private readonly IInnerSiteMapService _innerSiteMapService;
            private readonly IAccountChannelRelService _accountChannelRelService;
            private readonly IUserMgmtService _userMgmtService;
    
            public UserPermissionService(
                IInnerSiteMapDapperRep innerSiteMapDapperRep,
                IInnerSiteMapService innerSiteMapService, 
                IAccountChannelRelService accountChannelRelService, 
                IUserMgmtService userMgmtService)
            {
                _innerSiteMapDapperRep = innerSiteMapDapperRep;
                _innerSiteMapService = innerSiteMapService;
                _accountChannelRelService = accountChannelRelService;
                _userMgmtService = userMgmtService;
            }
    .................................................

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

    using System.Linq;
    using BQoolCommon.Interface.Factory;
    using BQoolCommon.Interface.Repository.Entity;
    using BQoolCommon.Models.BQoolCommon_SetMain;
    using BQoolCommon.Models.ViewModel;
    
    namespace BQoolCommon.Repository.Entity
    {
        public class WeChatSubscribeEntityRep : GenericEntityRep<WeChat_Subscribe>, IWeChatSubscribeEntityRep
        {
            public WeChatSubscribeEntityRep(IBqoolSetMainDbContextFactory factory) : base(factory)
            {
            }
        }
    }

    问题窥探

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

    改进思路

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

    影响

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

    总结

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

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

  • 相关阅读:
    KDD 2018 | 最佳论文:首个面向Facebook、arXiv网络图类的对抗攻击研究
    Distill详述「可微图像参数化」:神经网络可视化和风格迁移利器!
    T1330 最少步数(#Ⅱ- 8)(广度优先搜索)
    细胞个数题解(广度优先搜索)
    DRL前沿之:Benchmarking Deep Reinforcement Learning for Continuous Control
    DRL 教程 | 如何保持运动小车上的旗杆屹立不倒?TensorFlow利用A3C算法训练智能体玩CartPole游戏
    强化学习是如何解决问题的?
    深度强化学习泡沫及路在何方?
    ECCV 2018 | UBC&腾讯AI Lab提出首个模块化GAN架构,搞定任意图像PS组合
    纵览神经架构搜索方法
  • 原文地址:https://www.cnblogs.com/lyl6796910/p/14323645.html
Copyright © 2011-2022 走看看