ABP框架系列之六:(Value-Objects-值对象)
Introduction
"An object that represents a descriptive aspect of the domain with no conceptual identity is called a VALUE OBJECT." (Eric Evans).
“表示没有概念标识的域的描述方面的对象称为值对象。”(Eric Evans)。
As opposite to Entities, which have their identities (Id), a Value Object has not it's identity. If identities of two Entities are different, they are considered as different objects/entities even if all other properties of those entities are same. Think two different persons have same Name, Surname and Age but they are different people if their identity numbers are different. But, for an Address (which is a classic Value Object) class, if two addresses has same Country, City, Street number... etc. they are considered as the same address.
与具有身份(id)的实体相反,值对象没有它的标识。如果两个实体的身份不同,即使这些实体的所有其他属性相同,它们也被视为不同的对象/实体。认为两个不同的人有相同的名字,姓氏和年龄,但他们是不同的人,如果他们的身份号码是不同的。但是,对于一个地址(这是一个经典值对象)类,如果两个地址具有相同的国家,城市,街道号…等等,它们被认为是同一个地址。
In Domain Driven Design (DDD), Value Object is another type of domain object which can include business logic and is an essential part of the domain.
在领域驱动设计(DDD)中,值对象是另一种类型的域对象,它可以包含业务逻辑,是域的重要组成部分。
Value Object Base Class
ABP has a ValueObject<T> base class which can be inherited in order to easily create Value Object types. Example Address Value Object type:
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 base class overrides equality operator (and other related operator and methods) to compare two value object and assumes that they are identical if all properties are identical.
值类型继承基础类重载相等运算符(以及其他相关的操作和方法)比较两个值类型,假设所有的特性都是相同的他们都是相同的。
So, all of these tests pass:
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);
Even they are different objects in memory, they are identical for our domain.
即使它们是内存中不同的对象,它们对于我们的域也是相同的。
Best Practices
Here, some best practices for Value Objects:
- Design a value object as immutable (as like the Address above) if there is not a very good reason for designing it as mutable.
- The properties that make up a Value Object should form a conceptual whole. For example, CityId, Street and Number shouldn't be serarate properties of a Person entity. Also, this makes Person entity simpler.
如果没有很好的理由将值对象设计为可变的,那么就要设计一个不可变的值对象(如上面的地址)。
构成一个值对象的属性应该构成一个概念整体。例如,cityid,街道和号码不应该被一个人员实体分离。此外,这使实体更简单。
ABP框架系列之六:(Value-Objects-值对象)的更多相关文章
- 老周的ABP框架系列教程 -》 一、框架理论初步学习
老周的ABP框架系列教程 -- 一.框架理论初步学习 1. ABP框架的来源与作用简介 1.1 简介 1.1.1 ABP框架全称为"ASP.NET Boilerplate ...
- 2019 年起如何开始学习 ABP 框架系列文章-开篇有益
2019 年起如何开始学习 ABP 框架系列文章-开篇有益 [[TOC]] 本系列文章推荐阅读地址为:52ABP 开发文档 https://www.52abp.com/Wiki/52abp/lates ...
- ABP框架系列之十一:(AspNet-Core-ASPNET核心)
Introduction This document describes ASP.NET Core integration for ASP.NET Boilerplate framework. ASP ...
- DDD理论学习系列(7)-- 值对象
DDD理论学习系列--案例及目录 1.引言 提到值对象,我们可能立马就想到值类型和引用类型.而在C#中,值类型的代表是strut和enum,引用类型的代表是class.interface.delega ...
- ABP框架系列之三十九:(NLayer-Architecture-多层架构)
Introduction Layering of an application's codebase is a widely accepted technique to help reduce com ...
- ABP框架系列之五十四:(XSRF-CSRF-Protection-跨站请求伪造保护)
Introduction "Cross-Site Request Forgery (CSRF) is a type of attack that occurs when a maliciou ...
- ABP框架系列之三十四:(Multi-Tenancy-多租户)
What Is Multi Tenancy? "Software Multitenancy refers to a software architecture in which a sing ...
- ABP框架系列之二十一:(Domain-Services-领域服务)
Introduction Domain Services (or just Service, in DDD) is used to perform domain operations and busi ...
- ABP框架系列之十八:(Data-Transfer-Objects-数据转换对象)
Data Transfer Objects are used to transfer data between Application Layer and Presentation Layer. 数据 ...
随机推荐
- Java八大排序算法
Java八大排序算法: package sort; import java.util.ArrayList; import java.util.Arrays; import java.util.List ...
- List 的add()与addAll()的区别
add 是将传入的参数作为当前List中的一个Item存储,即使你传入一个List也只会另当前的List增加1个元素addAll 是传入一个List,将此List中的所有元素加入到当前List中,也就 ...
- 【亲测显式等待】Selenium:元素等待的4种方法
Selenium:元素等待的4种方法 1.使用Thread.sleep(),这是最笨的方法,但有时候也能用到而且很实用. 2.隐式等待,隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉We ...
- Idea中运行项目时出现:未结束的字符串解决方案
一般出现这种情况是编码不一致导致 解决办法: settings>file Encodings 编码设置成一致
- Flannel网络插件配置
# ps -ef|grep docker|grep bip FLANNEL_OPTIONS="-ip-masq=true" -ip-masq=true 这个参数的目的是让flann ...
- SQLyog简介及其功能(附百度云盘下载地址)
一.软件简介 SQLyog 是一个快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库.SQLyog是业界著名的Webyog公司出品的一款简洁高效.功能强大的图形化MyS ...
- linux下用python搭建简单的httpServer
1.服务器端:python -m SimpleHTTPServer 12000 python -m : 相当于import,当做模块来启动; 后面的12000代表的是端口 使用浏览器打开如下: 2. ...
- Mesh属性[Unity]
Mesh属性[Unity] Mesh是Unity内的一个组件,称为网格组件.3D网格是Unity中最重要的图形元素.在Unity中存在多种组件用于渲染标准网格或者蒙皮网格.拖尾或者3D线条. 在Uni ...
- JVM系列2:垃圾收集器与内存分配策略
垃圾收集是一个很大话题,本文也只是看了深入理解Java虚拟机总结了下垃圾收集的知识. 首先按照惯例,先上思维导图: 垃圾收集简而言之就是JVM帮我们清理掉内存区域不需要的数据.它主要负责清理堆中实例对 ...
- 联想电脑t450,t460p,t470等安装好ubuntu后启动找不到系统
其实我是这样解决的: 进入bios: 关quick start 关security 然后reboot就可以了