DDD領域驅動設計之運用層代碼

一、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);
            }
        }
    }
}
相關文章
相關標籤/搜索