领域驱动设计案例之领域层框架搭建

根据前面对领域驱动设计概念以及一些最佳实践的理解,领域模型是系统最核心的部分,我们还是采用前面销售订单的例子,这个案例系统的核心构建就从领域层开始。领域层框架搭建主要完成两个任务:

1.领域模型的建立,聚合与聚合根的确定,关系的确定。

2.建立支持DDD理论的领域层接口。

这里先上代码图,再详细讲每个部分的主要功能:

1.Model中主要确定了领域对象,聚合与聚合根,关联关系等,我们这里采用的是EF 的Model First建模,你也可以采取Code First。如下图:

2.Aggreate中主要定义了两个接口,一个是IEntity,一个是IAggreateRoot,分别表示实体与聚合根。我这里直接用表未来的GUID主键作为实体的唯一标识符

using System;

namespace Order.Domain.Aggreate
{
    public interface IEntity
    {
        Guid Id { get; }
    }
}
namespace Order.Domain.Aggreate
{
    public interface IAggreateRoot:IEntity
    {
    }
}

 3.Repository中主要定义了IRepository与IRepositoryContext接口。

    将IRepository接口定义在领域层的主要目的是:  

   1)领域层不应该直接依赖于仓储实现:如果领域层依赖于仓储实现,一是技术绑定太紧密,二是仓储要对领域对象作操作,会造成循环依赖。

   2)将接口定义在领域层,减少技术架构依赖,应用层或领域层要使用某个仓储实现时,通过依赖注入的方式将仓储实现注射到应用层或领域层,具体IOC在使用时对应用层与领域层的建议见前面的文章。

  定义IRepositoryContext接口的主要目的是:因为我们采用的持久化机制是EF,EF是通过DBContext来管理数据操作的事务,一般是针对单实体的。通常我们的业务需要持久化整个聚合的多个实体或通过领域服务或应用服务持久化多个聚合,多个实体或聚合在业务上需要保持一致性,为了达到这个目的,我们引入了工作单元模式与定义了仓储上下文,通过仓储上下文来管理操作的多个实体或多个聚合中的实体,然后通过工作单元模式统一提交来保证事务,从而保证业务的一致性。

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using Order.Domain.Aggreate;

namespace Order.Domain.Repository
{
    public interface IRepository<TAggreateRoot> where TAggreateRoot:class,IAggreateRoot
    {
        #region 创建对象
        void Create(TAggreateRoot aggreateroot);
        #endregion
        #region 重建对象
        TAggreateRoot GetbyId(Guid id);
        List<TAggreateRoot> GetbyCondition(Expression<Func<TAggreateRoot, bool>> condition);
        #endregion
        #region 更新对象
        void Update(TAggreateRoot aggreateroot);
        #endregion
        #region 销毁对象
        void Remove(TAggreateRoot aggreateroot);
        void RemoveById(Guid id);
        #endregion
    }
}
namespace Order.Domain.Repository
{
    public interface IUnitOfWork
    {
        bool Committed { get; }
        void Commit();
        void RollBack();
    }
}
using Order.Domain.Aggreate;
using System;

namespace Order.Domain.Repository
{
    public interface IRepositoryContext:IUnitOfWork,IDisposable
    {
        Guid ContextId { get; }
        /// <summary>
        /// 在事务上下文中标记聚合根为创建状态
        /// </summary>
        /// <typeparam name="TAggreateRoot"></typeparam>
        /// <param name="aggreateroot"></param>
        void RegisterCreate<TAggreateRoot>(TAggreateRoot aggreateroot) where TAggreateRoot:class,IAggreateRoot;
        /// <summary>
        /// 在事务上下文中标记聚合根为更改状态
        /// </summary>
        /// <typeparam name="TAggreateRoot"></typeparam>
        /// <param name="aggreateroot"></param>
        void RegisterUpdate<TAggreateRoot>(TAggreateRoot aggreateroot) where TAggreateRoot : class, IAggreateRoot;
        /// <summary>
        /// 在事务上下文中标记聚合根为销毁状态
        /// </summary>
        /// <typeparam name="TAggreateRoot"></typeparam>
        /// <param name="aggreateroot"></param>
        void RegisterRemove<TAggreateRoot>(TAggreateRoot aggreateroot) where TAggreateRoot : class, IAggreateRoot;
     }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏mwangblog

git,版本控制界的魔术师(1/18/2018)

1012
来自专栏圣杰的专栏

DDD理论学习系列(6)-- 实体

1.引言 实体对应的英语单词为Entity。提到实体,你可能立马就想到了代码中定义的实体类。在使用一些ORM框架时,比如Entity Framework,实体作...

2648
来自专栏tkokof 的技术,小趣及杂念

小话游戏脚本(一)

( 题记:近来在网上学习到一个新的观点(应该是来自刘未鹏的BLOG :) ):书写是为了更好的学习,这与之前脑子里传道授业解惑的观点颇为迥异,品一品又颇以为然...

941
来自专栏极客生活

真正好用的python库

这个库是我安装完python环境后第一个安装的库,装上这个库再开始写代码才有底气,作者 Kenneth Reitz 是公认python领域代码写的最好的两个人之...

1183
来自专栏进击的程序猿

通过Eloquent实现Repository模式

Eloquent采用了ActiveRecord的模式,这也让Eloquent招致了好多批评,让我们去看现在Eloquent/Model.php文件, 该文件已经...

913
来自专栏圣杰的专栏

DDD理论学习系列(12)-- 仓储

1. 引言 DDD中Repository这个单词,主要有两种翻译:资源库和仓储,本文取仓储之译。 说到仓储,我们肯定就想到了仓库,仓库一般用来存放货物,而仓库一...

2557
来自专栏Java技术栈

分享18道Java基础面试笔试题(面试实拍)

上图来自Java技术栈微信群里的群友分享,看起来比较基础,但不一定人人都答得上来。 图片比较模糊,小编把题目进行了文字化。 1.你最常上的两个技术站和最常使用的...

46611
来自专栏NetCore

更新自己,不要影响其他人

最近围绕着c++和C#的讨论越来越激烈,firelong努力着证明自己的观点,园子里一些大大们也在激烈的辩证着,作为小鸟的我,旁观,看看一笑而过吧。 其实无论哪...

21110
来自专栏非典型技术宅

iOS传感器:App前后台切换后,获取敏感信息使用touch ID进行校验1. 指纹识别传感器的用法介绍2. Touch ID指纹识别的代码实现3. 判断系统版本号的几种方法4. App从后台到前台,

1827
来自专栏Android 开发者

开发者也是用户 - 第二部分:改善 UI 和 API 可用性的五条指导原则

1813

扫码关注云+社区

领取腾讯云代金券