博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DDD~领域层
阅读量:6979 次
发布时间:2019-06-27

本文共 3875 字,大约阅读时间需要 12 分钟。

再论Domain与Infrastructure

在面向领域的设计中,领域层(Domain)实现上是位于最底层的,其它层有对它的引用,包括基础设施层(Infrastructure)也是去引用领域层的,我认为,这是对的,事实上,在Domain中会规定如何去进行数据持久化的操作,包括方法名,方法签名等等,而采用哪种架构去实现这种持久化的方法则是Infrastructure层需要做的,这种设计绝对是把领域,业务放在第一位的,完全符合Eric 的DDD。

Domain.Core Layer & Domain Layer

我们在进行软件设计时,一个习惯就是把仅供代码抽象出来,这是对的,也是符合标准的,对于domain层我们会把与具体领域无关的代码抽象成一个domain.core,这个项目位于整个DDD解决方案的最底层,而具体的domain则会引入它,看一下我们的DDD中的domain层

domain.core中有数据持久化的规范,规约实现Specification及一些公用的功能代码。

具体的domain项目中包括三部分内容,具体业务规范(如产品业务规范Products),数据模型POCO实体,用于网络传输的DTO实体(这部分可以单拿出来,本例直接放在了实体层),我们先来看一下products这个业务规范:

IProductRepository:它是产品实体的数据持久化规范,Infrastructure层会去实现它,这里不会关心Infrastructure是采用linq to sql还是ef,我只规定要做什么,至少怎么去做,由Infrastructure自己去决定!

  public interface IProductRepository : IExtensionRepository
{ ///
/// 获取产品列表 /// ///
IQueryable
GetProduct(); ///
/// 建立产品 /// void AddProduct(Product entity); ///
/// 修改产品 /// void ModifyProduct(System.Linq.Expressions.Expression
> entity); }

ProductSpecification:这是一个与业务息息相关的规约类,它会根据具体业务去设计每一个业务的具体规约

  ///     /// 通过用户信息得到他的订单列表    ///     public class ProductSpecification : Specification
{ string _productName = default(string); public ProductSpecification(string productName) { _productName = productName; } public override Expression
> SatisfiedBy() { Specification
spec = new TrueSpecification
(); if (string.IsNullOrWhiteSpace(_productName)) spec &= new DirectSpecification
(o => o.ProductName.Contains(_productName)); return spec.SatisfiedBy(); } }

网络传输对象DTO,它是在进行WEB通讯时为了减少网站负载,而提出的新的实体层,将与本服务有关的实体属性提出,形成一个新的实体,这在SOA服务

中用的比较多。

  [DataContract]    public class ProductDTO    {        [DataMember]        [DisplayName("商品ID")]        public int ProductID { get; set; }        [DataMember]        [DisplayName("商品名称")]        public string ProductName { get; set; }        [DataMember]        [DisplayName("建立日期")]        public System.DateTime CreateDate { get; set; }        [DataMember]        public int SaleCount { get; set; }        [DataMember]        public Nullable
ClickCount { get; set; } [DataMember] [DisplayName("产品描述")] public string Info { get; set; } [DataMember] public int UserID { get; set; } [DataMember] [DisplayName("销售价格")] public decimal SalePrice { get; set; } [DataMember] [DisplayName("折扣")] public int Discount { get; set; } }

数据模型EDMX,这种模块我们称为entity frameworks模型,也叫EF模型,它可以把物理数据库映射到EDMX文件中,它是以XML形式保存的,而我们

的POCO简单数据实体也可以由工具自动生成,这些实体与原始数据表一一对应。ef poco 模型实体采用partial class方便开发人员以后对实体类进行扩展。

  public partial class Product    {        public Product()        {            this.ProductDetail = new HashSet
(); } public int ProductID { get; set; } public string ProductName { get; set; } public System.DateTime CreateDate { get; set; } public int SaleCount { get; set; } public Nullable
ClickCount { get; set; } public string Info { get; set; } public int UserID { get; set; } public decimal SalePrice { get; set; } public int Discount { get; set; } public System.DateTime UpdateDate { get; set; } public virtual User_Info User_Info { get; set; } public virtual ICollection
ProductDetail { get; set; } }

最后,我们看一个domain与Infrastructure之间的数据通信,它们一般使用IOC容器进行实现,像和都是不错的选择,而unity是一个强大的工具

集,它不仅包括IOC的功能,而且还提供了对AOP的实现!下次我们将着重介绍一下Unity在DDD中的使用,介请期待!

 本文转自博客园张占岭(仓储大叔)的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
React Native开源项目如何运行(附一波开源项目)
查看>>
js 创建一条通用链表
查看>>
Webpack 核心开发者 Sean Larkin 盛赞 Vue
查看>>
七牛云内容审核服务被选为「上海首批人工智能创新产品」
查看>>
总结PHP 7新增加的特性
查看>>
【刷算法】LeetCode- 两数之和
查看>>
与HTTP关系密切的协议:IP、TCP、DNS
查看>>
pwa+webpack,初探与踩坑
查看>>
x-http-wrapper: 如何解决每次发版时,修改http相关代码造成的错误!(Android、iOS、h5)...
查看>>
java/android 设计模式学习笔记(1)--- 单例模式
查看>>
Python 代码规范
查看>>
Python 之 pip拒绝访问
查看>>
cglib代理的使用
查看>>
Format specifies type 'id' but the argument has type 'NSError *__autoreleasing *
查看>>
[译] JWT 与 Spring Cloud 微服务
查看>>
Android NDK开发之旅31 FFmpeg音频解码
查看>>
关于Android开源库分享平台,(GitClub)微信小程序的开发体验
查看>>
Thrift RPC 系列教程(4)——源码目录结构组织
查看>>
CentOS 部署 flask项目
查看>>
Kotlin学习笔记-基础语法
查看>>