当前位置: 首页 > news >正文

个人网站广告联盟搭建龙岗商城网站建设最好

个人网站广告联盟搭建,龙岗商城网站建设最好,贵州省住房和城乡建设厅网站官网,网站设计作业多少钱27 | 定义Entity#xff1a;区分领域模型的内在逻辑和外在行为上一节讲到领域模型分为两层一层是抽象层#xff0c;定义了公共的接口和类另一层就是领域模型的定义层先看一下抽象层的定义1、实体接口 IEntitynamespace GeekTime.Domain {public interface IEntity{object[] G… 27 | 定义Entity区分领域模型的内在逻辑和外在行为上一节讲到领域模型分为两层一层是抽象层定义了公共的接口和类另一层就是领域模型的定义层先看一下抽象层的定义1、实体接口 IEntitynamespace GeekTime.Domain {public interface IEntity{object[] GetKeys();}public interface IEntityTKey : IEntity{TKey Id { get; }} }通常情况下实体只有一个 ID但是也不排除存在多个 ID 的情况所以这里的接口 IEntity 定义实现为多个 ID 的情况而 IEntity 表示实体只有一个 Id同样看一下 Entity 的定义public abstract class Entity : IEntitypublic abstract class EntityTKey : Entity, IEntityTKey同样地定义了一个 Entity 和 Entity这样就可以在实体上面定义一些共享的方法比如 ToStringpublic abstract class Entity : IEntity {public abstract object[] GetKeys();public override string ToString(){// 输出当前实体的名称以及它的 Id 的清单return $[Entity: {GetType().Name}] Keys {string.Join(,, GetKeys())};} }对于 Entity 定义了比较多的方法public abstract class EntityTKey : Entity, IEntityTKey {int? _requestedHashCode;public virtual TKey Id { get; protected set; }public override object[] GetKeys(){return new object[] { Id };}/// summary/// 表示对象是否相等/// 这个方法的重载使我们可以正确的判断两个实体是否是同一个实体/// 根据 Id 判断如果没有 Id 的话两个实体是不会相等的/// /summary/// param nameobj/param/// returns/returnspublic override bool Equals(object obj){if (obj null || !(obj is EntityTKey))return false;if (Object.ReferenceEquals(this, obj))return true;if (this.GetType() ! obj.GetType())return false;EntityTKey item (EntityTKey)obj;if (item.IsTransient() || this.IsTransient())return false;elsereturn item.Id.Equals(this.Id);}/// summary/// 这个方法用来辅助对比两个对象是否相等/// /summary/// returns/returnspublic override int GetHashCode(){if (!IsTransient()){if (!_requestedHashCode.HasValue)_requestedHashCode this.Id.GetHashCode() ^ 31;return _requestedHashCode.Value;}elsereturn base.GetHashCode();}/// summary/// 表示对象是否为全新创建的未持久化的/// /summary/// returns/returnspublic bool IsTransient(){// 如果它没有 Id 就表示它没有持久化return EqualityComparerTKey.Default.Equals(Id, default);}public override string ToString(){return $[Entity: {GetType().Name}] Id {Id};}/// summary/// 操作符 重载/// 借助上面的 Equals 方法/// 使得可以直接用 判断两个领域对象是否相等/// /summary/// param nameleft/param/// param nameright/param/// returns/returnspublic static bool operator (EntityTKey left, EntityTKey right){if (Object.Equals(left, null))return (Object.Equals(right, null)) ? true : false;elsereturn left.Equals(right);}/// summary/// 操作符 ! 重载/// /summary/// param nameleft/param/// param nameright/param/// returns/returnspublic static bool operator !(EntityTKey left, EntityTKey right){return !(left right);} }2、聚合根接口 IAggregateRootnamespace GeekTime.Domain {public interface IAggregateRoot{} }聚合根接口实际上是一个空接口它不实现任何的方法它的作用是在实现仓储层的时候让一个仓储对应一个聚合根3、领域事件接口 IDomainEventnamespace GeekTime.Domain {public interface IDomainEvent : INotification{} }4、域事件处理接口 IDomainEventHandlernamespace GeekTime.Domain {public interface IDomainEventHandlerTDomainEvent : INotificationHandlerTDomainEventwhere TDomainEvent : IDomainEvent{} }5、还有一个领域模型里面比较关键的值对象 ValueObject值对象的定义比较特殊因为它是没有 Id 的所以没有关于 Id 的定义并且没有对值对象定义接口重点实现了它是否相等的判断也是重载了 Equals 这个方法和 GetHashCode 这个方法protected static bool EqualOperator(ValueObject left, ValueObject right) {if (ReferenceEquals(left, null) ^ ReferenceEquals(right, null)){return false;}return ReferenceEquals(left, null) || left.Equals(right); }protected static bool NotEqualOperator(ValueObject left, ValueObject right) {return !(EqualOperator(left, right)); }public override int GetHashCode() {return GetAtomicValues().Select(x x ! null ? x.GetHashCode() : 0).Aggregate((x, y) x ^ y); }它有一个特殊的抽象方法的定义获取它的原子值protected abstract IEnumerableobject GetAtomicValues();这个方法的作用是将值对象的字段输出出来作为唯一标识来判断两个对象是否相等可以看到 Equals 的定义里面也是调用了获取原子值这个方法来判断它是否相等public override bool Equals(object obj) {if (obj null || obj.GetType() ! GetType()){return false;}ValueObject other (ValueObject)obj;IEnumeratorobject thisValues GetAtomicValues().GetEnumerator();IEnumeratorobject otherValues other.GetAtomicValues().GetEnumerator();while (thisValues.MoveNext() otherValues.MoveNext()){if (ReferenceEquals(thisValues.Current, null) ^ ReferenceEquals(otherValues.Current, null)){return false;}if (thisValues.Current ! null !thisValues.Current.Equals(otherValues.Current)){return false;}}return !thisValues.MoveNext() !otherValues.MoveNext(); }接下来看一下定义的 Order 实体public class Order : Entitylong, IAggregateRoot {public string UserId { get; private set; }public string UserName { get; private set; }public Address Address { get; private set; }public int ItemCount { get; private set; }protected Order(){ }public Order(string userId, string userName, int itemCount, Address address){this.UserId userId;this.UserName userName;this.Address address;this.ItemCount itemCount;this.AddDomainEvent(new OrderCreatedDomainEvent(this));}public void ChangeAddress(Address address){this.Address address;} }它首先实现了 Entity这一个在上一节已经讲过另外一个 Order 定义为一个聚合根它需要实现聚合根接口 IAggregateRoot实体中字段的 set 设置为 private这样的好处是 Order 所有的数据的操作都应该由实体负责而不应该被外部对象去操作从而让领域模型符合封闭开放的原则对于领域模型的操作都应该是定义具有业务逻辑含义的方法来定义比如说 ChangeAddress就定义一个 ChangeAddress 的方法把新的地址传进来由领域模型负责赋值这里面就可以添加一些地址的校验比如新的地址是否能够与旧的地址距离太远看一下地址的定义public class Address : ValueObject {public string Street { get; private set; }public string City { get; private set; }public string ZipCode { get; private set; }public Address() { }public Address(string street, string city, string zipcode){Street street;City city;ZipCode zipcode;}protected override IEnumerableobject GetAtomicValues(){yield return Street;yield return City;yield return ZipCode;} }只能通过构造函数给值对象赋值这里面需要注意的是重载了获取原子值的方法使用了 yield return总结一下在定义领域模型的时候首先领域模型的字段的修改应该设置为私有的使用构造函数来表示对象的创建它的初始值都是由构造函数的参数来赋值的另外需要定义有业务含义的动作来操作模型的字段领域模型只负责自己数据的处理领域服务或者命令负责调用领域模型的业务动作样就可以区分领域模型的内在逻辑和外在逻辑使代码结构更加合理
http://www.zqtcl.cn/news/567255/

相关文章:

  • 网站正在建设中 动态徐州网站建设方案咨询
  • 广东世纪达建设集团有限公司官方网站专业电商网站开发
  • 抚顺建设网站自适应网站建设推荐
  • 做网站的大公司手机页面
  • 网站建设的公司实习做什么系统设计
  • 兰州网站设计哪个平台好外贸网站定制公司哪家好
  • 做网站需要先买域名吗在线音乐网站开发数据库
  • 深圳优化网站搬家网站模板
  • 网站建设做的人多吗门户网站制作建设
  • 哪个网站可以做logo怀柔网页公司制作
  • 网站被抄袭怎么投诉网站建设丨金手指15
  • 中国交建平台seo搜索引擎优化是通过优化答案
  • 简述网站的建设流程图食品网站app建设方案
  • 西安建设厅网站首页听说上海又要封了
  • 兼职python做网站如何制作一个网站包含多个网页
  • 花园桥网站建设百度怎么创建网站
  • 做网站 客户一直要求改做网站学不需要做后台管理系统
  • 企业网站托管电话输入姓名查询个人征信
  • 域名注册了后怎么建设网站荆州市建设厅网站
  • 厦门网站建设合同wordpress的设置网址
  • 澎湃动力网站建设公司门户类网站建设需要多少钱
  • 祭祖网站怎么做咨询类网站开发的意义
  • 简书网站开发热门电影推荐
  • 中学教材数字化学习资源的建设——教材配套网站的设计及发展趋势建网站 发信息 做推广
  • 怎么写网站建设方案书制做网站的公司
  • 服务网站 建设原则游戏服务器租用多少钱一年
  • 软件网站下载现在出入深圳最新规定
  • 长宁专业网站制作公司陕西网站建设哪家专业
  • 重庆做的好的房产网站衡水的网站建设
  • 宜春网站开发网页编辑器安卓版