DDD领域模型企业级系统(二)

摘要:
用户层:1.请求应用层获取用户显示的信息。2.向应用层发送命令以请求执行某个命令。应用层:为用户界面提供各种应用功能(包括信息获取和命令执行)。应用程序层不包含业务逻辑。业务层由调用域层(域对象或域服务)的应用层完成。应用层为薄层。域层包括域对象和域服务,系统的核心是完成系统所需的业务处理。业务逻辑和仓库接口位于域级基础架构级别:它包括其他层(如物理存储)所需的所有基本服务和技术

用户层:

1.请求应用层获取用户显示的信息

2.发送命令给应用层要求执行某个命令

应用层:

对用户界面提供各种应用功能(包括信息获取与命令执行),应用层不包含业务逻辑,业务层是由应用层调用领域层(领域对象或领域服务)来完成的,应用层是很薄的一层

领域层:

包含领域对象和领域服务,完成系统所需的业务处理,是系统的核心。业务逻辑与仓储接口都在领域层

基础机构层:

包含其他层所需要使用的所有基础服务与技术,比如仓储的实现(与数据打交道)、短消息发送、Json字符串处理

工作单元:

保证聚合间的一致性

通常在领域服务或应用服务中使用工作单元

仓储实现不用考虑数据库事务

一般通过应用层访问仓储,而且是使用领域层定义的仓储接口,具体仓储的实现调用可以通过IOC的机制在应用层通过服务定位器模式找到。

一般不要在领域层访问仓储,如果领域层中的领域对象或领域服务的业务逻辑处理确实需要访问仓储,建议不通过服务定位器的方式在领域层进行服务解析,

而是应该在领域对象或领域服务的构造函数中传入仓储接口,具体是哪个仓储实现,仍然在服务层通过应用模式找到,这样保证服务层只关注业务,而不关注其他方面

一些界面需要获取的查询信息,不应该通过领域对象直接返回给应用服务层,应该在应用 层实现DTO

代码:

DDD领域模型企业级系统(二)第1张

   /// <summary>
    /// 仓储的接口   维护这个接口里面的状态
    /// </summary>
    /// <typeparam name="TAggreateRoot"></typeparam>
   public interface IRepository<TAggreateRoot> where TAggreateRoot:class, IAggreateRoot
    {
        void Create(TAggreateRoot aggreateroot);
        TAggreateRoot GetByID(Guid id);
        List<TAggreateRoot> GetByCondition(Expression<Func<TAggreateRoot, bool>> condition);
        void Update(TAggreateRoot aggreateroot);
        void Remove(TAggreateRoot aggreateroot);
        void RemovdByID(Guid id);
    }
/// <summary>
    /// 仓储上下文的接口  全部放到上下文中  通过工作单元 一起提交
    /// IDisposable  定时释放资源
    /// </summary>
    public interface IRepositoryContext:IUnitOfWork,IDisposable
    {
        //创建对象的集合
        void RegisterCreate<TAggreateRoot>(TAggreateRoot aggreateroot) where TAggreateRoot : class, IAggreateRoot;

        //修改
        void RegisterUpdate<TAggreateRoot>(TAggreateRoot aggreateroot) where TAggreateRoot : class, IAggreateRoot;

        //删除
        void RegisterRemove<TAggreateRoot>(TAggreateRoot aggreateroot) where TAggreateRoot : class, IAggreateRoot;
        Guid ContextID { get;  }

    }
public interface IUnitOfWork
    {
        void Commit();
        void RollBack();
        //是否提交
        bool Committed { get; set; }
    }

 仓储上下文:

 public abstract class RepositoryContext : IRepositoryContext, IDisposable
    {
        //保证线程本地化
        private readonly ThreadLocal<Dictionary<Guid, object>> localcreatedics = new ThreadLocal<Dictionary<Guid, object>>();

        private readonly ThreadLocal<Dictionary<Guid, object>> localupdatedics = new ThreadLocal<Dictionary<Guid, object>>();

        private readonly ThreadLocal<Dictionary<Guid, object>> localremovedics = new ThreadLocal<Dictionary<Guid, object>>();

        //是否已经提交
        private readonly ThreadLocal<bool> localcommitted = new ThreadLocal<bool>(()=>true);

       public virtual void RegisterCreate<TAggreateRoot>(TAggreateRoot aggreateroot) where TAggreateRoot :
            class, IAggreateRoot
        {
            if (aggreateroot.Id.Equals(Guid.Empty))
            {
                throw new AggregateException("聚合根ID不能为空");
            }
            if (localcreatedics.Value.ContainsKey(aggreateroot.Id))
            {
                throw new InvalidOperationException("新创建的领域对象已经存在在集合中");
            }
            //向集合总提交  聚合根的id  和聚合根
            localcreatedics.Value.Add(aggreateroot.Id, aggreateroot);
            //标注为未提交
            localcommitted.Value = false;
        }

      public virtual void RegisterUpdate<TAggreateRoot>(TAggreateRoot aggreateroot) where TAggreateRoot :
            class, IAggreateRoot
        {
            if (aggreateroot.Id.Equals(Guid.Empty))
            {
                throw new AggregateException("聚合根ID不能为空");
            }
            if (localupdatedics.Value.ContainsKey(aggreateroot.Id))
            {
                throw new InvalidOperationException("更新的领域对象已经存在在集合中");
            }
            if (localremovedics.Value.ContainsKey(aggreateroot.Id))
            {
                throw new InvalidOperationException("领域对象正在被更新,不能删除");
            }
            localremovedics.Value.Add(aggreateroot.Id, aggreateroot);
            localcommitted.Value = false;
        }

       public virtual  void RegisterRemove<TAggreateRoot>(TAggreateRoot aggreateroot) where TAggreateRoot :
            class, IAggreateRoot
        {
            if (aggreateroot.Id.Equals(Guid.Empty))
                throw new ArgumentException("聚合根ID不能为空");
            if (localremovedics.Value.ContainsKey(aggreateroot.Id))
                throw new InvalidOperationException("删除的领域对象已经存在在集合中");
            if (localupdatedics.Value.ContainsKey(aggreateroot.Id))
                throw new InvalidOperationException("领域对象正在被更新,不能删除");
            localremovedics.Value.Add(aggreateroot.Id, aggreateroot);
            localcommitted.Value = false;
        }

        public Guid ContextID
        {
            get
            {
                return Guid.NewGuid();
            }
        }

        public abstract void Commit();
      

        /// <summary>
        /// 提交的属性
        /// </summary>
        public bool Committed
        {
            get { return localcommitted.Value; }
            set { localcommitted.Value = value; }
        }

        /// <summary>
        /// 释放资源
        /// </summary>
        public virtual void Dispose()
        {
            localcreatedics.Dispose();
            localupdatedics.Dispose();
            localremovedics.Dispose();
            localcommitted.Dispose();
        }

        //在仓储中具体实现
        public  abstract void RollBack();  
    }

 具体的实现 :

/// <summary>
    /// 仓储类的实现  
    /// </summary>
    public class EFRepository<TAggreateRoot> : EFRepositoryContext, IRepository<TAggreateRoot>
        where TAggreateRoot :class,IAggreateRoot
    {
        public void Create(TAggreateRoot aggreateroot)
        {
            base.RegisterCreate(aggreateroot);
        }

        public List<TAggreateRoot> GetByCondition(Expression<Func<TAggreateRoot, bool>> condition)
        {
            throw new NotImplementedException();
        }

        public TAggreateRoot GetByID(Guid id)
        {
            throw new NotImplementedException();
        }

        public void RemovdByID(Guid id)
        {
            throw new NotImplementedException();
        }

        public void Remove(TAggreateRoot aggreateroot)
        {
            base.RegisterRemove(aggreateroot);
        }

        public void Update(TAggreateRoot aggreateroot)
        {
            base.RegisterUpdate(aggreateroot);
        }
    }

仓储上线文的实现:

/// <summary>
    /// 仓储上下文的实现
    /// </summary>
    public class EFRepositoryContext : RepositoryContext
    {
        public override void RegisterCreate<TAggreateRoot>(TAggreateRoot aggreateroot)
        {
            base.RegisterCreate<TAggreateRoot>(aggreateroot);
            Committed = false;
        }
        public override void RegisterRemove<TAggreateRoot>(TAggreateRoot aggreateroot)
        {
            base.RegisterRemove<TAggreateRoot>(aggreateroot);
            Committed = false;
        }
        public override void RegisterUpdate<TAggreateRoot>(TAggreateRoot aggreateroot)
        {
            base.RegisterUpdate<TAggreateRoot>(aggreateroot);
            Committed = false;
        }
        public override void Commit()
        {
            Committed = true;
        }

        public override void RollBack()
        {
            Committed = true;
        }

        public override void Dispose()
        {
            base.Dispose();
        }
    }

判断ID:

 public interface  IEntity
    {
        Guid Id { get; }
    }
public  interface IAggreateRoot:IEntity
    {
    }
 public abstract class AggreateRoot:Entity
    {
    }
 public abstract class Entity : IEntity
    {
        public Guid Id
        {
            get
            {
                var id = Guid.NewGuid();
                return id;
            }
        }

        /// <summary>
        /// 比较两个对象
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public override bool Equals(object obj)
        {
            if (obj == null)
            {
                return false;
            }
            //判断两个实列是否相等
            if (ReferenceEquals(this, obj))
            {
                return true;
            }
            //判断ID是否相等
            return this.Id == (obj as IEntity).Id;
        }

        public override int GetHashCode()
        {
            return this.Id.GetHashCode();
        }
    }

免责声明:文章转载自《DDD领域模型企业级系统(二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jsp页面中的代码执行加载顺序介绍常见的性能测试误区下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DDD:策略模式如何结合动态表达式

企业应用中我们经常会遇到各种业务规则,针对这种规则,我们多数情况会采用策略模式,每种策略对应一个具体类和一个具体的配置界面。但是企业业务的规则经常变化,现有的策略随着时间的推移而不能满足要求,针对这种情况我们可以用动态表达式来解决。 动态表达式:在静态语言中动态的执行代码,目前可选的技术有:动态编译、Iron、Roslyn、内嵌小语言。 今天来测试一下内嵌...

iOS的永久存储

iOS中的永久存储也是相对的(以下所讲的永久存储也是如此),在用户不对设备进行恢复或还原操作时,部分数据是可以做到永久存储的(即应用被删除后重新安装数据不会丢失,在替代UUID方法中较为有效)。 几个概念: 1.UUID: (Universally Unique Identifier) 通用唯一标识符,是一个标识符标准用于软件架构,由开放软件基金会(OSF...

SQL Server中如何生成GUID C#.NET中如何生成和使用GUID

GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。通常平台会提供生成GUID的API。生成算法很有意思,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。GUID的唯一缺陷在于生成的结果串会比较大。” 1.一个GUID为一个128位的整数(16字节),在使用唯一标识符的情况下,你可以在所有计算机和网络...

领域模型(二)

前言 MODEL-DRIVEN DESIGN(模型驱动设计)利用模型来为应用程序解决问题。 团队成员通过UBIQUITOUS LANGUAGE(通用语言)交流进行知识消化,以便有效建模,而MODEL-DRIVEN DESIGN绑定模型与实现,以此为出发点做出的软件产品才能在完全理解核心领域的基础上提供丰富的功能。 有效建模的要素 1、绑定模型与实现。实现...

如何修改.net framework(转载)

这段时间为跟踪一个Bug而焦头烂额,最后发现是Framework的问题,这让人多少有些绝望。所以到微软论坛提了个帖子,希望能得到些帮助。虽然论坛智能到能够判断楼主是否是MSDN订阅用户,以便尽快解决(传说MSDN订阅用户的问题能在两天内得到回复的,当时还很得意公司为我们购买的MSDN订阅账号),但得到的回复是“Could you file a bug re...

DDD从入门到精通:基础篇

这篇文章主要还是表述清楚DDD相关的基础概念,因为DDD入门有一定的专业名词,还是得有个基本的了解。 先讲解下领域模型作用: 对软件需求进行设计,维持其内在逻辑的一致性 1)划分边界、也是一种高内聚、低耦合 2)所有逻辑都是内聚在对象内部的【包含行为和数据】   为什么需要DDD? 行业现状:   贫血模型、充血模型   领域模型就是DDD? 其实领域...