1、说明html
本篇博客参考 http://www.cnblogs.com/xqin/p/3708367.html, 但源博客贴出了部分代码,对部分代码没有过多的解释。本篇针对想参考现成的完整代码的人。
数据库
2、背景函数
一、概要编码
每个企业应用中不可避免的都会涉及到业务编码规则的问题,好比订单管理系统中的订单编号,好比商品管理系统中的商品编码,好比项目管理系统中的项目编码等等,这一系列的编码都须要管理起来,那么它们的应该如何编码的,具体的编码规则咱们不少时候都是直接写在程序当中 spa
二、分析设计
经常使用的的编码有:
一、数据库自增加ID或最大值加1
二、GUID
三、时间戳
四、常量+自增加
五、常量+时间戳+自增加
六、根据单据属性编码 好比商品编码:第X是代码商品颜色,第Y位是代码商品产地
七、自定义函数处理返回
八、其它htm
三、思考对象
第一个问题就是单据编码的时间顺序:blog
一、新增前先预取得新单据编码 优势是保存处理很简单,并且保存后不须要再刷新UI,缺点就是若是放弃表单那么编码计数已经跳号,作不到连续的单据号,并且无法实现上面编码的第6种状况。 继承
二、保存时才生成单据编码 缺点是保存比较麻烦点,并且保存后须要再刷新UI中的单据编码字段,可是若是是须要根据单据属性编码,那就必作得使用这种方式了,并且能作到单据连续。
第二个问题是这个编码该怎么去取,怎么保证惟一性 。
这里要看是使用哪一种编码方式,好比 max + 1 这种方式 就直接检索数据库 select max(id) + 1 from table 取得编码,若是是GUID则比较方便,可是GUID看着实在是有点恶心,使用时间戳的话若是精确到秒的话是没办法保证惟一性的,即便精确到毫秒理论上也是不行的。其它复杂的编码获取就更麻烦点了。总之不是很方便就能取得。 第三个问题若是这个编码规则须要更换怎么办 这个若是没有特别设计编码规则通常都要修改程序,没办法说不动程序直接修改配置就能实现
3、目的及设计
一、设计
鉴于以上几个问题,咱们想设计一个比较通用的业务编码规则模块,之后的项目也可复用,它应该要实现如下功能及特色:
一、知足各类编码规则的需求
a.背景中提到的那7种都要实现,还要求各类规则能够自由组合
b.依赖重置,好比日期变化时序号自动重置为1
二、拓展性强,可添加自定义规则
三、经过配置文件或数据进行配置,修改业务编码规则只须要修改配置文件或数据
四、使用简单
二、数据库设置
咱们先从配置来设计,咱们把规则配置放在数据库中,能够考虑之后再作个界面来管理这些配置。设计2张表来保存这些规则
一、单据编码
二、单据编码规则 用来存储基础规则组合,一种单据编码对应多种规则
三、调用
public class PurchasingApiController : ApiController { private ISequenceFactory _sequenceFactory; public PurchasingApiController(ISequenceFactory sequenceFactory) { _sequenceFactory = sequenceFactory; } //取得主表的BillNo public string GetNextBillNo() { var sequence = _sequenceFactory.Create("sdx_purchasing"); return sequence.Next(); } //用BillNo过滤取得从表中的RowId public string GetNextRowId(string key) { var sequence = _sequenceFactory.Create("sdx_purchasingLine"); sequence.SetValue("BillNo", key) return sequence.Next(); } }
Sequence对象中主要就是一个Next()的实现
四、代码结构
稍微解释说明下:
一、DefaultSequenceFacotry 继承自接口ISequenceFactory负责构建Squence
二、Sequence 继承自ISeqence是採番的主要处理类,此类里能够设置上下文数据
三、SequenceContext Sequence上下文对象,保留着数据库的直接信息或者从数据库取出经过工厂模式建立的信息
四、Resets文件夹中类 继承自ISequenceReset,由SequenceResetFactory构建,处理重置的对象,好比今天的编号A20160130-001到A20160130-010,那么当明天到了编号须要重置成A20160131-001
五、Rules文件夹中类 继承自抽象类SequenceRuleBase,由SequenceRuleFactory构建,就是一系列规则信息
六、IClassSequenceHandler 自定义类规则接口,实现这个添口可添加自定义规则,SequenceHandler中是两个自定义类规则的实现 。(例如:商品编号须要受到商品颜色和其余属性影响的条件下)
五、实例
一个简单的例子:通常的编号形式是WT20160131001 其中包括3个规则,它在数据库的存储为:
a:主表T_Sequence存储重置信息及其余
程序根据表中SequenceReset反射调取相应的重置实现,根据CurrentCode判断何时去重置。
b:T_SequenceSetting表存储规则
程序根据RuleName去反射调用相应的规则类。
4、源码
针对源博客没有给出Sequence的完整代码。在理解做者的思想下已经补充完整:
源码下载:百度网盘连接:http://pan.baidu.com/s/1hrk3N2s 密码:man6