DDD领域驱动设计实践篇之如何提取模型

需求说明:

  • 省级用户可以登记国家指标
  • 省级用户和市级用户可以登记指标分解
  • 登记国家指标时,需要录入以下数据:指标批次、文号、面积,这里省略其他数据,下同
  • 登记指标分解时,需要录入以下数据:指标批次、文号、面积,以及可以选择多个市(市级登记的时候是县)的指标,每个市(县)的指标也是要输入批次、文号、面积
  • 登记指标分解时,一个指标批次不能选择多个相同的市(县)
  • 登记指标分解时,需要判断当前剩余面积是否足够,比如省登记的时候,要看国家本年度下发给省的指标面积是否大于省本年度所以指标面积,登记国家指标不需要这个判断
  • 指标登记完后,需要下发,下发后,对应的市县才能看到数据
  • 国家下发给省,省下发给本省和市,市下发给本市和县,县不能下发,只能查看市下发的数据
  • 下发给下级的叫下发指标,下发给本级的叫预留指标
  • 每次登记的年度都是用当前年度
  • 每次登记都要生成一个项目编号,规则为100001+行政区+6位流水号

提取领域模型:

  • 我们这里省略那些高大上的建模、什么共同语言等,直接进入话题,要的就是一个合理的模型,不管是怎么提取的,怎么抽象出来的,就是要一个结果
  • 下面是我提取的模型,英文太烂,所以命名看起来很不舒服,欢迎拍砖
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    /// <summary>
        /// 指标实体
        /// </summary>
        public class Indicators
        {
            /// <summary>
            /// ID
            /// </summary>
            public string Id { get; protected set; }
            /// <summary>
            /// 项目编号
            /// </summary>
            public string Number { get; set; }
            /// <summary>
            /// 面积
            /// </summary>
            public decimal Area { get; set; }
            /// <summary>
            /// 批次
            /// </summary>
            public decimal Batch { get; set; }
            /// <summary>
            /// 文号
            /// </summary>
            public decimal DocumentNumber { get; set; }
            /// <summary>
            /// 下发文号
            /// </summary>
            public decimal SubDocumentNumber { get; set; }
            /// <summary>
            /// 年份
            /// </summary>
            public int Year { get; set; }
            /// <summary>
            /// 当前用户的行政区编码
            /// </summary>
            public string CityCode { get; set; }
             
        }

      

模型说明:

  • 类的命名用Indicators应该没有问题,直接用“指标”翻译的
  • 至于为什么要Parent和Items,是因为在下发指标分解的时候,需要填写一个预留指标和多个下发指标,所以构成了一个树的结构,当然业务只有两级的
  • 实践中,其实不需要两级,虽然看起来每次登记指标分解的时候,都需要输入预留指标和多个下发指标,但是他们从结构上没有关系,只是引用同一个批次构成了一个整体而已
 
 

DDD领域驱动设计的更多相关文章

  1. 浅谈我对DDD领域驱动设计的理解

    从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...

  2. DDD 领域驱动设计-商品建模之路

    最近在做电商业务中,有关商品业务改版的一些东西,后端的架构设计采用现在很流行的微服务,有关微服务的简单概念: 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独 ...

  3. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(3)

    上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(2)> 这篇文章主要是对 DDD.Sample 框架增加 Transa ...

  4. DDD 领域驱动设计-两个实体的碰撞火花

    上一篇:<DDD 领域驱动设计-领域模型中的用户设计?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新) 在 ...

  5. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(2)

    上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(1)> 阅读目录: 抽离 IRepository 并改造 Reposi ...

  6. DDD 领域驱动设计-领域模型中的用户设计

    上一篇:<DDD 领域驱动设计-如何控制业务流程?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新,并增加了 ...

  7. DDD 领域驱动设计-如何控制业务流程?

    上一篇:<DDD 领域驱动设计-如何完善 Domain Model(领域模型)?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sa ...

  8. DDD 领域驱动设计-如何完善 Domain Model(领域模型)?

    上一篇:<DDD 领域驱动设计-如何 DDD?> 开源地址:https://github.com/yuezhongxin/CNBlogs.Apply.Sample(代码已更新) 阅读目录: ...

  9. DDD领域驱动设计之领域服务

    1.DDD领域驱动设计实践篇之如何提取模型 2.DDD领域驱动设计之聚合.实体.值对象 3.DDD领域驱动设计之领域基础设施层 什么是领域服务,DDD书中是说,有些类或者方法,放实体A也不好,放实体B ...

  10. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(1)

    好久没写 DDD 领域驱动设计相关的文章了,嘎嘎!!! 这几天在开发一个新的项目,虽然不是基于领域驱动设计的,但我想把 DDD 架构设计的一些东西运用在上面,但发现了很多问题,这些在之前的短消息项目中 ...

随机推荐

  1. getBoundingClientRect的用法

    getBoundingClientRect用于获取某个元素相对于视窗的位置集合.集合中有top, right, bottom, left等属性. 1.语法:这个方法没有参数. rectObject = ...

  2. 怎样在多线程中使用JNI?

    假设你想了解JNI在怎样在多线程下使用 假设你在子线程使用JNI时遇到findClass不能找到目标Class,而在主线程下却能找到该Class的问题.或是GetEnv返回NULL的问题 假设你想多学 ...

  3. Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)

    原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...

  4. HDU 4292Food(网络流的最大流量)

    职务地址:HDU 4292 水题. 因为每一个人仅仅能有1份,所以须要拆点限制流量.建图方法为,建一源点与汇点.将食物与源点相连,权值为食物额数量,将饮料与汇点相连,权值为饮料数量..然后将人进行拆点 ...

  5. interview(转)

    http://ifeve.com/ali-think-12/ http://ifeve.com/think-in-ali-10/

  6. Alice&#39;s Chance

    id=1698" style="background-color:rgb(51,255,51)">主题链接 意甲冠军: 爱丽丝要拍电影.有n部电影,规定爱丽丝第i部 ...

  7. 基于Js实现的UrlEncode和UrlDecode函数代码

    <script language="javascript">//UrlEncode函数function UrlEncode(str){  var ret="& ...

  8. oracle_自动备份用户数据,删除N天前的旧数据(非rman,bat+vbs)

    有时数据没有实时备份恢复那么高的安全性需求,但每天 ,或者定期备份表结构 和数据依旧是很有必要的,介绍一种方法 在归档和非归档模式均可使用的自动备份方法. 预期效果是备份用户下的数据含表结构,备份文件 ...

  9. [注意事项&amp;车轮]java源代码 产生局部javadoc api档

    随着Eclipse书写java码时间,有时候,因为我们不知道java函数返回.通过鼠标移动到java该功能,假设它javadoc相关内容将被显示. 但是,并非所有java代码javadoc:连装jav ...

  10. Msgbox消息框

    于"自"<软件开发工具>一本书有这样的制剂,让我回忆--程序员可以做,让用户做:它允许用户做的少,即使是那些谁需要做的程序设置.我们应该做的. 这不是宣言.该是践行. ...