2018-01-10  14:11:30

电商平台 订购和支付 模块

一: 整体示意图

二:构建一个框架来处理 领域模型内部发生的事情--领域事件

  1. IDomainEvent 标识模型中的 DomainEvent
  2. IDomainEventHandler<T> where T : IDomainEvent 事件处理程序必须实现的接口。
  3. IDomainEventHandlerFactory 用来获取给定领域事件的处理程序的集合
  4. 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);
    }
    } }
  5. 静态类 DomainEvents -- 为了引发事件。

  支持领域事件所需的框架。

  

 

二 : 领域对象

  1. Payment  值对象, 继承自 Infrastructure  -- ValueObjectBase  
  2. OrderItem 实体  继承自 EntityBase<int>
  3. 与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);
}
}
}

   

Software--电商平台--Module 5 Order & Payment的更多相关文章

  1. 电商平台如何接入快递鸟电子面单API?

    快递鸟是全球物流接口服务商,为电商 ERP.电商平台.仓储.清关公司提供物流跟踪.电子面单.智选物流.物流金融.在线下单等服务,解决电商的物流管理模块和金融模块.现就对快递鸟电子面单API做基本描述, ...

  2. 谈B2B电商平台与大数据

    数据为王,服务为本——谈B2B电商平台与大数据 2013-06-27 11:10:41 作者:B2B行业资讯 标签:                             大数据           ...

  3. Java开源生鲜电商平台-财务系统模块的设计与架构(源码可下载)

    Java开源生鲜电商平台-财务系统模块的设计与架构(源码可下载) 前言:任何一个平台也好,系统也好,挣钱养活团队这个是无可厚非的,那么对于一个生鲜B2B平台盈利模式( 查看:http://www.cn ...

  4. Java开源生鲜电商平台-售后模块的设计与架构(源码可下载)

    Java开源生鲜电商平台-售后模块的设计与架构(源码可下载) 说明:任何一个的电商平台都有售后服务系统,那么对于我们这个生鲜的电商平台,售后系统需要思考以下几个维度. 1. 买家的需求维度 说明:买家 ...

  5. Java生鲜电商平台-统一格式返回的API架构设计与实战

    Java生鲜电商平台-统一格式返回的API架构设计与实战 说明:随着互联网各岗位精细化分工的普及,出现了很多的系统架构设计,比如常见的前后端分离架构,后端提供接口给前端,前端根据接口的数据进行渲染,大 ...

  6. Java生鲜电商平台-订单模块状态机架构设计

    Java生鲜电商平台-订单模块状态机架构设计 说明:在Java生鲜电商平台中订单的状态流转业务        我们知道 一个订单会有很多种状态:临时单.已下单.待支付.待收货.待评价.已完成,退货中等 ...

  7. Java生鲜电商平台-深刻理解电商的库存架构与解决方案

    Java生鲜电商平台-深刻理解电商的库存架构与解决方案 说明:一般电商的库存都是跟SKU相关联的,那么怎么样才能进行SKU的库存管理呢?有以下几种方式与方法: 一.七大库存分类 首先得学习什么是库存, ...

  8. Java生鲜电商平台-物流配送的设计与架构

    Java生鲜电商平台-物流配送的设计与架构 说明:由于Java开源生鲜电商平台是属于自建物流系统,也就是买家下的单,需要公司派物流团队进行派送.            业务需求中买家的下单时间控制在: ...

  9. Java生鲜电商平台-提现模块的设计与架构

    Java生鲜电商平台-提现模块的设计与架构 补充说明:生鲜电商平台-提现模块的设计与架构,提现功能指的卖家把在平台挣的钱提现到自己的支付宝或者银行卡的一个过程. 功能相对而言不算复杂,有以下几个功能需 ...

  10. 从电商平台促销活动看电商app开发趋势

    据亿合科技小编了解到:尽管各大电商平台都进入了品质和品牌时代,但对于消费者来说,低价依然是一个有吸引力的因素.尼尔森<网络购物者趋势研究>报告显示,2016年价格敏感型购物者的比例从15% ...

随机推荐

  1. 新手搭建Git与项目整合

    新手搭建Git,将代码托管到码云 如果你还没有使用过Git,首先先去https://gitee.com/注册一个自己的账户,然后在https://git-scm.com/下载一个客户端(提交代码到码云 ...

  2. vxWidgets(一):初识

    wxWidgets 和 QT 之间的选择 跨平台的C++ GUI工具库很多,可是应用广泛的也就那么几个,Qt.wxWidgets便是其中的翘楚这里把GTK+排除在外,以C实现面向对象,上手相当困难,而 ...

  3. FreeRdp(一):主要数据结构

    /** RDP连接实例 * 这是创建连接后的客户端选项 * 数据结构申请内存调用freerdp_new,释放为freerdp_free */ struct rdp_freerdp { ALIGN64 ...

  4. SDN之Openflow+OpenDayLight课程开课通知

    内容简介: 该课程为期2天,在这两天里 我们将会深入体会SDN的特点与传统网络的区别 ,掌握SDN架构里各层的协议用途,Openflow作为sdn里的一款开源的南向协议,最大的意义体现在它实现了网络设 ...

  5. 微信小程序中如何把数组从一个页面传到另一个页面,并且获取数据

    // 传送端 举例 wx.navigateTo({ url: 'recite/recite?openid=' + k.data.openid + '&isexist=' + k.data.is ...

  6. flutter Slivers

    一. Slivers 我们考虑一个这样的布局:一个滑动的视图中包括一个标题视图(HeaderView),一个列表视图(ListView),一个网格视图(GridView). 我们怎么可以让它们做到统一 ...

  7. vscore 中 vim 常用快捷键

    谷歌浏览器 ctrl + T 新建一个页面 ctrl + J 查看下载界面 F6 直接搜索 vscore 在 vscore 中使用 vim 建议去掉 ctrl 键的功能捆绑,不然会覆盖掉很多的 vsc ...

  8. js获取url中的查询参数

    // 获取url中query // return {cate_id: '1', street_id: '0'} function getParams() { var url = location.se ...

  9. chia NFT 经验

    除了NFT的ID 其他所有内容都可以相同包括NFT数据,meta,许可证 收藏集创建一次后就无法更改了,如果之后的mint中重新设置了收藏集,将无效, 收藏集只认UUID,不认名称.

  10. CIL指令和指针类型的操作

    对象引用的使用在CIL中受到严格限制.它们几乎完全被使用带有VOS(Virtual Object System)指令,这些指令是专门为处理对象和部分对象引用而设计的. 常规操作如下: 首先我们需要将加 ...