2018-01-10 14:11:30
电商平台 订购和支付 模块
一: 整体示意图
二:构建一个框架来处理 领域模型内部发生的事情--领域事件
- IDomainEvent 标识模型中的 DomainEvent
- IDomainEventHandler<T> where T : IDomainEvent 事件处理程序必须实现的接口。
- IDomainEventHandlerFactory 用来获取给定领域事件的处理程序的集合
- IEnumerableExtension 获取到 IDomainEventHandler 集合之后, 调用它们的处理方法并将领域事件作为动作的实参。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Agathas.Storefront.Infrastructure.Domain.Events { public static class IEnumerableExtensions { public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) { foreach (T item in source) action(item); } } }
- 静态类 DomainEvents -- 为了引发事件。
支持领域事件所需的框架。
二 : 领域对象
- Payment 值对象, 继承自 Infrastructure -- ValueObjectBase
- OrderItem 实体 继承自 EntityBase<int>
- 与OrderItem 相关联的 Order
EntityBase<int>
using System.Collections.Generic; namespace Agathas.Storefront.Infrastructure.Domain { public abstract class EntityBase<TId> { private List<BusinessRule> _brokenRules = new List<BusinessRule>(); public TId Id { get; set; } protected abstract void Validate(); public IEnumerable<BusinessRule> GetBrokenRules() { _brokenRules.Clear(); Validate(); return _brokenRules; } protected void AddBrokenRule(BusinessRule businessRule) { _brokenRules.Add(businessRule); } public override bool Equals(object entity) { return entity != null && entity is EntityBase<TId> && this == (EntityBase<TId>)entity; } public override int GetHashCode() { return this.Id.GetHashCode(); } public static bool operator ==(EntityBase<TId> entity1, EntityBase<TId> entity2) { if ((object)entity1 == null && (object)entity2 == null) { return true; } if ((object)entity1 == null || (object)entity2 == null) { return false; } if (entity1.Id.ToString() == entity2.Id.ToString()) { return true; } return false; } public static bool operator !=(EntityBase<TId> entity1, EntityBase<TId> entity2) { return (!(entity1 == entity2)); } } }
ValueObjectBase
using System.Collections.Generic; using System.Linq; using System.Text; namespace Agathas.Storefront.Infrastructure.Domain { public abstract class ValueObjectBase { private List<BusinessRule> _brokenRules = new List<BusinessRule>(); public ValueObjectBase() { } protected abstract void Validate(); public void ThrowExceptionIfInvalid() { _brokenRules.Clear(); Validate(); if (_brokenRules.Count() > 0) { StringBuilder issues = new StringBuilder(); foreach (BusinessRule businessRule in _brokenRules) issues.AppendLine(businessRule.Rule); throw new ValueObjectIsInvalidException(issues.ToString()); } } protected void AddBrokenRule(BusinessRule businessRule) { _brokenRules.Add(businessRule); } } }