Welcome

首页 / 软件开发 / 数据结构与算法 / DDD领域驱动设计:聚合、实体、值对象

DDD领域驱动设计:聚合、实体、值对象2016-03-21 cnblogs 刘标才关于具体需求,请看前面的博文:DDD领域驱动设计实践篇之如何提取模型,下面是具体的实体、聚合、值对象的代码,不想多说什么是实体、聚合等概念,相信理论的东西大家已经知晓了。本人对DDD表示好奇,没有在真正项目实践过,甚至也没有看过真正的DDD实践的项目源码,处于极度纠结状态,甚至无法自拔,所以告诫DDD爱好者们,如果要在项目里面实践DDD,除非你对实体建模和领域职责非常了解(很多时候会纠结一些逻辑放哪里好,属于设计问题)以及你的团队水平都比较高认同DDD,否则请慎重。。。勿喷!

代码在后,请先看DEMO结果图

1、聚合的基类,注意,几乎属性都是拼音首字母命名,勿喷哈,不要跑题!

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using DDD.Infrastructure;using DDD.Infrastructure.Domain; namespace DDD.Domain{/// <summary>/// 项目基类/// </summary>public abstract class ProjectBase : EntityBase, IAggregateRoot{protected ProjectBase(){this.ND = DateTime.Now.Year;this.CJSJ = DateTime.Now;this.WH = new DocumentNumber();} /// <summary>/// 安排批次/// </summary>public int APPC { get; set; }/// <summary>/// 项目名称/// </summary>public string XMMC { get; set; }/// <summary>/// 项目编号/// </summary>public string XMBH { get; internal set; }/// <summary>/// 年度/// </summary>public int ND { get; set; }/// <summary>/// 文号/// </summary>public DocumentNumber WH { get; set; }/// <summary>/// 创建时间/// </summary>public DateTime CJSJ { get; set; }/// <summary>/// 下发行政区名称/// </summary>public string XFXZQMC { get; set; }/// <summary>/// 下发行政区代码/// </summary>public string XFXZQDM { get; set; }/// <summary>/// 行政区名称/// </summary>public string XZQMC { get; set; }/// <summary>/// 行政区代码/// </summary>public string XZQDM { get; set; }/// <summary>/// 备注/// </summary>public string BZ { get; set; }/// <summary>/// 指标级别/// </summary>public IndicatorGrade ZBJB { get; set; }/// <summary>/// 附件id/// </summary>public decimal ATTACHID { get; set; }/// <summary>/// 项目状态/// </summary>public ProjectStauts Status { get; set; } /// <summary>/// 业务代码/// </summary>protected abstract string BussinessCode { get; } /// <summary>/// 登记/// </summary>/// <param name="seq"></param>public virtual void Register(){this.XMBH = this.BussinessCode + SeqGeneratr.Generate();} /// <summary>/// 是否可以更新或者删除/// </summary>/// <returns></returns>public virtual bool CanUpdate(){return this.ZBJB == IndicatorGrade.Country || this.XFXZQDM == this.XZQDM || this.Status == ProjectStauts.Default;} public void Send(){this.Status = ProjectStauts.Sent;}}}
2、聚合1

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using DDD.Infrastructure;using DDD.Infrastructure.Domain; namespace DDD.Domain.Indicator{/// <summary>/// 计划指标/// </summary>public class PlanIndicator : ProjectBase{public PlanIndicator(){IndicatorArea = new IndicatorArea();} protected override string BussinessCode{get { return "103101"; }} /// <summary>/// 指标面积/// </summary>public IndicatorArea IndicatorArea{get;set;} public override IEnumerable<BusinessRule> Validate(){if (this.IndicatorArea.GD > this.IndicatorArea.NYD){yield return new BusinessRule("IndicatorArea.GD", "耕地面积不能大于农用地面积");}} public override void Register(){if (this.ZBJB == IndicatorGrade.Country){this.Send();}base.Register();}}}
3、聚合2