一、DDD領域驅動設計實踐篇之如何提取模型html
二、DDD領域驅動設計之聚合、實體、值對象ide
三、DDD領域驅動設計之領域基礎設施層this
四、DDD領域驅動設計之領域服務spa
五、總體DEMO代碼設計
什麼是運用層,說白了就是之前三層的BLL,沒有什麼特別,只是調用的不是之前的DAL了,而是領域層+基礎設施層,運用層接口基本是能夠根據原型來作的,也就是UI須要什麼數據就定義什麼接口,難點就在於怎麼去調用領域層了,這個若是是分開來開發的話,難度會很大,爲何是很難呢,緣由就在於區分職責,須要有很詳細的領域層說明以及實時的參與領域建模。htm
運用層代碼1對象
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using DDD.Domain; using DDD.Domain.Arrange; namespace DDD.Services { public class PlanArrangeService : NDJHService<PlanArrange>, IPlanArrangeService { private readonly IPlanArrangeRepository repository; private readonly ArrangeService service; protected PlanArrangeService(IPlanArrangeRepository repository, ArrangeService service) : base(repository) { this.repository = repository; this.service = service; } /// <summary> /// 查找可下發的批次列表 /// </summary> /// <param name="xzqdm"></param> /// <returns></returns> public override IList<BatchModel> FindAllowSendBatches(string xzqdm) { if (string.IsNullOrEmpty(xzqdm)) throw new ArgumentNullException("xzqdm"); if (!xzqdm.EndsWith("00")) //若是是縣級用戶,則不須要判斷t.XFXZQDM != t.XZQDM這個條件 { var list = FindBy(0, 0, xzqdm, ProjectStauts.Default).OrderBy(a => a.APPC).ToList(); var query = from t in list group t by new { t.APPC, t.ND } into temp select new BatchModel { Batch = temp.Key.APPC, IsSent = false, Year = temp.Key.ND }; return query.ToList(); } else { return base.FindAllowSendBatches(xzqdm); } } /// <summary> /// 查找計劃安排列表 /// </summary> /// <param name="year">年度</param> /// <param name="grade">指標級別</param> /// <param name="xzqdm">行政區代碼</param> /// <returns></returns> public IList<PlanArrange> FindByDescendants(int year, string xzqdm, IndicatorGrade? grade = null) { if (string.IsNullOrEmpty(xzqdm)) throw new ArgumentNullException("xzqdm"); var query = this.repository .Where(GetDistrictCodeExpr(xzqdm)) .Where(grade.HasValue, a => a.ZBJB == grade.Value) .Where(year != 0, a => a.ND == year); if (xzqdm.EndsWith("0000")) { //省級用戶能夠查看國家安排、省級安排、市縣級已下發的安排 if (grade == IndicatorGrade.City || grade == IndicatorGrade.County) { query = query.Where(t=>t.Status == ProjectStauts.Sent); } } else if (xzqdm.EndsWith("00")) { //市級用戶能夠查看國家、省、縣已下發的安排、市級安排 if (grade != IndicatorGrade.City) { query = query.Where(t => t.Status == ProjectStauts.Sent); } } else { //縣級用戶能夠查看國家、省、市已下發的安排、縣級項目 if (grade != IndicatorGrade.County) { query = query.Where(t => t.Status == ProjectStauts.Sent); } } return query.OrderBy(t => t.APPC).ToList(); } /// <summary> /// 行政區代碼表達式 /// </summary> /// <param name="xzqdm">通常爲參數傳遞的值</param> /// <returns></returns> private Expression<Func<PlanArrange, bool>> GetDistrictCodeExpr(string xzqdm) { if (string.IsNullOrEmpty(xzqdm)) throw new ArgumentNullException("xzqdm"); if (xzqdm.EndsWith("0000")) { var sub = xzqdm.Substring(0, 2); return d => d.XFXZQDM.Contains(sub); } else if (xzqdm.EndsWith("00")) { var sub = xzqdm.Substring(0, 4); return d => d.XFXZQDM.Contains(sub); } else { return d => d.XFXZQDM.Contains(xzqdm); } } public override void Update(PlanArrange entity) { service.CheckUpdate(entity); base.Update(entity); } public override void Register(PlanArrange entity, IList<PlanArrange> entities) { if (entity == null) throw new ArgumentNullException("entity"); Validate(entity); Validate(entities); service.Register(entity, entities); repository.Add(entity); foreach (var item in entities) { repository.Add(item); } } } }
運用層代碼2blog
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using DDD.Domain; using DDD.Domain.Indicator; namespace DDD.Services { public class PlanIndicatorService : NDJHService<PlanIndicator>, IPlanIndicatorService { private readonly IPlanIndicatorRepository repository; private readonly IndicatorService service; protected PlanIndicatorService(IPlanIndicatorRepository repository, IndicatorService service) : base(repository) { this.repository = repository; this.service = service; } /// <summary> /// 查找指標列表(國家下發,省級發,市級下發) /// </summary> /// <param name="year">年度</param> /// <param name="xzqdm">下發行政區代碼</param> /// <param name="grade">指標級別</param> /// <returns></returns> public IList<PlanIndicator> FindReceive(int year, string xzqdm) { if (string.IsNullOrEmpty(xzqdm)) throw new ArgumentNullException("xzqdm"); return this.repository .Where(t => t.XFXZQDM != t.XZQDM) .Where(t => t.XFXZQDM == xzqdm) .Where(t => t.Status == ProjectStauts.Sent) .Where(year != 0, a => a.ND == year) .OrderBy(a => a.APPC).ToList(); } /// <summary> /// 查找預留指標列表(省級預留,市級預留) /// </summary> /// <param name="year">年度</param> /// <param name="xzqdm">行政區代碼</param> /// <returns></returns> public IList<PlanIndicator> FindReserve(int year, string xzqdm) { if (string.IsNullOrEmpty(xzqdm)) throw new ArgumentNullException("xzqdm"); return this.repository .Where(a => a.XFXZQDM == a.XZQDM) .Where(a => a.XZQDM == xzqdm) .Where(year != 0, a => a.ND == year) .OrderBy(a => a.APPC).ToList(); } /// <summary> /// 查找下發指標列表(下發市級,下發縣級) /// </summary> /// <param name="year">年度</param> /// <param name="xzqdm">行政區代碼</param> /// <returns></returns> public IList<PlanIndicator> FindSendTo(int year, string xzqdm) { if (string.IsNullOrEmpty(xzqdm)) throw new ArgumentNullException("xzqdm"); return this.repository .Where(a => a.XFXZQDM != a.XZQDM) .Where(a => a.XZQDM == xzqdm) .Where(year != 0, a => a.ND == year) .OrderBy(a => a.APPC).ToList(); } /// <summary> /// 查找指定行政區下發的指標(預留+下發) /// </summary> /// <param name="status">狀態</param> /// <param name="xzqdm">行政區代碼</param> /// <returns></returns> public IList<PlanIndicator> FindSend(string xzqdm, ProjectStauts status) { if (string.IsNullOrEmpty(xzqdm)) throw new ArgumentNullException("xzqdm"); return this.repository .Where(a => a.XZQDM == xzqdm) .Where(t => t.Status == status) .OrderBy(a => a.APPC).ToList(); } /// <summary> /// 統計預留指標 /// </summary> /// <param name="year"></param> /// <param name="xzqdm"></param> /// <returns></returns> public IndicatorArea TotalReserveIndicator(int year, string xzqdm) { if (string.IsNullOrEmpty(xzqdm)) throw new ArgumentNullException("xzqdm"); return repository.TotalReserveIndicator(year, xzqdm); } /// <summary> /// 統計上級下發給下級指標(省-國家下發,市-省級下發,縣-市級下發) /// </summary> /// <param name="year"></param> /// <param name="xzqdm"></param> /// <returns></returns> public IndicatorArea TotalReceiveIndicator(int year, string xzqdm) { if (string.IsNullOrEmpty(xzqdm)) throw new ArgumentNullException("xzqdm"); return repository.TotalReceiveIndicator(year, xzqdm); } /// <summary> /// 統計下發給下級的指標(省-市級下發,市-縣級下發) /// </summary> /// <param name="year"></param> /// <param name="xzqdm"></param> /// <returns></returns> public IndicatorArea TotalSendToIndicator(int year, string xzqdm) { if (string.IsNullOrEmpty(xzqdm)) throw new ArgumentNullException("xzqdm"); return repository.TotalSendToIndicator(year, xzqdm); } public override void Update(PlanIndicator entity) { service.CheckUpdate(entity); base.Update(entity); } public override void Register(PlanIndicator entity, IList<PlanIndicator> entities) { if (entity == null) throw new ArgumentNullException("entity"); Validate(entity); Validate(entities); service.Register(entity, entities); repository.Add(entity); foreach (var item in entities) { repository.Add(item); } } } }