<<ABP框架>> 值对象

文档目录

本节内容:

  • 简介
  • 值对象基类
  • 最佳实践

简介

“一个表示领域的一个描述性方面的没有概念上的身份对象,称为值对象。“(Eric Evans)。

与一个有身份(Id)实体相反,一个值对象没有身份。如果两个实体的身份(Id)不同,它们被认为是不同对象/实体,即使其它所有的属性都相同。比如两个不同的Person实体,它们的Name、Surname和Age相同,如果它们的Id不同,我们就认为这是两个不同的Person。但是,对于一个Address(地址,一个经典的值对象)类,如果两个地址有相同的国家、城市、街道号码等,它们就被认为是同一个address对象。

在DDD里,值对象是另一种类型的领域对象,它可以包含业务逻辑和领域的要素。

值对象基类

为可简单地创建值对象类型,可以继承ABP的ValueOjbect<T>基类,例如Address值对象类型:

public class Address : ValueObject<Address>
{
    public Guid CityId { get; private set; } //A reference to a City entity.

    public string Street { get; private set; }

    public int Number { get; private set; }

    public Address(Guid cityId, string street, int number)
    {
        CityId = cityId;
        Street = street;
        Number = number;
    }
}

ValueObject基类重写了相等操作符(==,和其它相关的操作符和方法),用来比较两个值对象,如果所有属性都是相同的,那么就认为这两个值对象是相同的。所以这些测试都可以通过:

var address1 = new Address(new Guid("21C67A65-ED5A-4512-AA29-66308FAAB5AF"), "Baris Manco Street", 42);
var address2 = new Address(new Guid("21C67A65-ED5A-4512-AA29-66308FAAB5AF"), "Baris Manco Street", 42);

Assert.Equal(address1, address2);
Assert.Equal(address1.GetHashCode(), address2.GetHashCode());
Assert.True(address1 == address2);
Assert.False(address1 != address2);

即使它们在内存里是不同的,对于我们的领域来说也是相同的。

最佳实践

这里有些关于值对象的最佳实践:

  • 把值对象设计成不可变的(如上面的Address),如果没有好的理由,不要把它设计成可变的。
  • 组成一个值对象的属性应该形成一个概念上的整体。例如:CityId,Street和Number不应该被分离成Person的三个属性,而且整个值对象也简化了Person实体。
时间: 2024-07-29 05:35:51

<<ABP框架>> 值对象的相关文章

&lt;&lt;ABP框架&gt;&gt; 数据传输对象

文档目录 本节内容: DTO 必要性 领域层的抽象 数据隐藏 序列化和延迟加载问题 DTO 约定和验证 示例 DTO和实体间自动映射 使用特性和扩展方法进行映射 辅助接口和类 Data Transfer Objects(DTO)用来在应用层和展现层之间传输数据. 展现层使用一个DTO调用一个应用服务方法,然后应用服务使用服务对象执行一些特定业务逻辑,并返回一个DTO给展现层.因此,展现层是完全独立于领域层的.在一个理想的分层应用里,展现层不直接使用领域对象(仓储.实体...). DTO 必要性

ABP官方文档翻译 3.2 值对象

值对象 介绍 值对象基类 最佳实践 介绍 "展现领域描述性层面且没有概念性身份的对象称之为值对象."(Eric Evans). 和实体相反,实体有身份标示(Id),值对象没有身份标示.如果两个实体的身份标示是不同的,那么就认为他们是不同的对象/实体,即使他们的所有属性都是一样的.考虑两个不同的人有相同的名字.姓氏和年龄,但是他们是不同的人,如果他们的身份编号不同的话.但是,对于一个地址(经典的值对象)类,如果两个地址有相同的国家.城市.街道编号等等,则认为为相同的地址. 在DDD中,值

应用程序框架实战十六:DDD分层架构之值对象(介绍篇)

前面介绍了DDD分层架构的实体,并完成了实体层超类型的开发,同时提供了验证方面的支持.本篇将介绍另一个重要的构造块——值对象,它是聚合中的主要成分. 如果说你已经在使用DDD分层架构,但你却从来没有使用过值对象,这毫不奇怪,因为多年来养成的数据建模思维已经牢牢把你禁锢,以致于你在使用面向对象方式进行开发时,还是以数据为中心. 当我们完成了基本的需求分析以后,如果说需要进行设计,那么你能想到的就是数据库表及表关系的设计,这就是数据建模.数据建模的主要依据是数据库范式设计,根据要求严格程度的递增分为

应用程序框架实战十七:DDD分层架构之值对象(层超类型篇)

上一篇介绍了值对象的基本概念,得到了一些朋友的支持,另外也有一些朋友提出了不同意见.这其实是很自然的事情,设计本来就充满了各种可能性,没有绝对正确的做法,只有更好的实践.但是设计与实践的好与坏,对于不同的人,以及处于不同的环境都有不同的诠释,这是一个仁者见仁,智者见智的问题.DDD非常抽象,以至于它的每一个概念,对于不同的人都有不同的看法,更何况基于DDD的.Net实践,就更难分辨哪一个用法更标准.更正宗. 我对DDD的认识虽然还很肤浅,用得也很山寨,但这可能更加适合初步接触DDD的朋友.还是那

ABP应用层——数据传输对象(DTOs)

ABP应用层——数据传输对象(DTOs) 基于DDD的现代ASP.NET开发框架--ABP系列之16.ABP应用层——数据传输对象(DTOs) ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 数据传输对象(Data Transfer Objects)用

ABP(现代ASP.NET样板开发框架)系列之16、ABP应用层——数据传输对象(DTOs)

点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之16.ABP应用层——数据传输对象(DTOs) ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 数据传输对象(Data Transfer Objects)用于应用层和

【ABP框架系列学习】N层架构(3)

原文:[ABP框架系列学习]N层架构(3) 目录 0.引言 1.DDD分层 2.ABP应用构架模型 客户端应用程序(Client Applications) 表现层(Presentation Layer) 分布式服务层(Distributed Service Layer) 应用层(Application Layer) 领域层 基础设施层 3.使用ABP项目模版快速生成应用程序 0.引言 应用程序的分层是一种广泛接受的技术, 可以降低复杂度和提高代码的可重用性.为了实现分层架构,ABP遵循领域驱动

【ABP框架系列学习】启动配置(5)

ABP提供了在启动时配置模块的基础设施和模型. 1.配置ABP 配置ABP是在模块的PreInitialize方法中完成的,例如: public class SimpleTaskSystemModule : AbpModule { public override void PreInitialize() { //添加语言 Configuration.Localization.Languages.Add(new LanguageInfo("en", "English"

ABP开发框架前后端开发系列---(15)ABP框架的服务端和客户端缓存的使用

缓存在一个大型一点的系统里面是必然会涉及到的,合理的使用缓存能够给我们的系统带来更高的响应速度.由于数据提供服务涉及到数据库的相关操作,如果客户端的并发数量超过一定的数量,那么数据库的请求处理则以爆发式增长,如果数据库服务器无法快速处理这些并发请求,那么将会增加客户端的请求时间,严重者可能导致数据库服务或者应用服务直接瘫痪.缓存方案就是为这个而诞生,随着缓存的引入,可以把数据库的IO耗时操作,转换为内存数据的快速响应操作,或者把整个页面缓存到缓存系统里面.本篇随笔主要介绍利用ABP框架的支持实现