背景

之前写过三篇文章介绍如何实现这种编号生成器:

  • http://www.cnblogs.com/happyframework/archive/2013/05/12/3073688.html。
  • http://www.cnblogs.com/happyframework/archive/2013/05/13/3074410.html。
  • http://www.cnblogs.com/happyframework/archive/2013/05/14/3077095.html。

上周整理了一下,把代码合并到了http://happy.codeplex.com/,需要的朋友直接下载最新代码,不要用Download(直接去Source Code下载)。

今天重点介绍一下如何使用。

一些常见的编号示例

像如下这些规则,非常容易支持,如:

  • 【xxxx】年某企业第【x】份劳动合同,规则配置:【<日期:yyyy>】年某企业第【<种子:销售订单:yyyy>】份劳动合同。
  • xxxx年xxxx月xxxx日第x份销售订单,规则配置:<日期:yyyy年MM月dd日>第<种子:销售订单:yyyyMMdd>份销售订单。

测试代码

 1 using System;
 2 using System.Collections.Generic;
 3 using Microsoft.VisualStudio.TestTools.UnitTesting;
 4 using System.IO;
 5
 6 using Happy.Domain.CodeRule;
 7 using Happy.Domain.CodeRule.Generators;
 8
 9 namespace Happy.Test.Doamin.CodeRule
10 {
11     [TestClass]
12     public class CodeRuleInterceptorTest
13     {
14         [TestMethod]
15         public void Intercept_Test()
16         {
17             var seedKey = "销售订单";
18             var file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Seeds", seedKey + ".txt");
19             if (File.Exists(file))
20             {
21                 File.Delete(file);
22             }
23
24             var interceptor = new CodeRuleInterceptor();
25
26             interceptor
27                 .RegisterInterceptor(new DateTimeCodeGeneratorInterceptor())
28                 .RegisterInterceptor(new LiteralCodeGeneratorInterceptor())
29                 .RegisterInterceptor(new SeedCodeGeneratorInterceptor(new FileSeedStore()));
30
31             var generator = interceptor.Intercept("前缀---<日期:yyyyMMdd>---中缀---<种子:销售订单>---后缀");
32
33             Assert.IsNotNull(generator);
34
35
36             Assert.AreEqual("前缀---20130705---中缀---00001---后缀", generator.Generate(new GenerateContext()));
37             Assert.AreEqual("前缀---20130705---中缀---00002---后缀", generator.Generate(new GenerateContext()));
38             Assert.AreEqual("前缀---20130705---中缀---00003---后缀", generator.Generate(new GenerateContext()));
39         }
40     }
41 }

常见问题

问:种子的生成能保证唯一性吗?答:是的,在并发情况下也能保证唯一。

问:种子的生成能保证连续性吗?答:是的,约束就是必须使用基于数据库的种子仓储(Happy.Infrastructure.PetaPoco.PetaPocoSeedStore),且必须运行在处于”可重复读“隔离级别的事务中,上边的测试用例采用的是基于文件的。

问:为什么一定要配置规则,解释执行?答:这是面向产品级别的项目,如果是一般的项目,直接用种子仓储就行了,代码如下:

 1 using System;
 2 using Microsoft.VisualStudio.TestTools.UnitTesting;
 3 using System.IO;
 4
 5 using Happy.Domain.CodeRule;
 6
 7 namespace Happy.Test.Doamin.CodeRule
 8 {
 9     [TestClass]
10     public class FileSeedStoreTest
11     {
12         [TestMethod]
13         public void NextSeed_Test()
14         {
15             var seedKey = "销售订单";
16             var file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Seeds", seedKey + ".txt");
17             if (File.Exists(file))
18             {
19                 File.Delete(file);
20             }
21
22             var seedStore = new FileSeedStore();
23
24             Assert.AreEqual(1, seedStore.NextSeed(seedKey));
25             Assert.AreEqual(2, seedStore.NextSeed(seedKey));
26             Assert.AreEqual(3, seedStore.NextSeed(seedKey));
27         }
28     }
29 }

备注

这种规则生成器,我在产品和项目中都有用过,新入门的朋友可以直接使用,高手要多提些意见。

幸福框架:可扩展的、动态的、万能的 编号生成器相关推荐

  1. Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展

    Spark Streaming揭秘 Day9 从Receiver的设计到Spark框架的扩展 Receiver是SparkStreaming的输入数据来源,从对Receiver整个生命周期的设计,我们 ...

  2. 幸福框架:模式驱动开发

    背景 我非常喜欢各种模式(很多还都看不懂),几乎会购买关于模式的任何书籍,生怕有所遗漏,关于模式的优势以及如何使用好模式已经有很多文章在介绍了,我今天想给大家分享的是我的一个想法:模式驱动开发,即如何 ...

  3. 第二百六十四节,Tornado框架-基于正则的动态路由映射分页数据获取计算

    Tornado框架-基于正则的动态路由映射分页数据获取计算 分页基本显示数据 第一步.设置正则路由映射配置,(r"/index/(?P<page>\d*)", inde ...

  4. 使用Canvas扩展绘制动态ASP.NET Core Blazor条形图

    目录 介绍 背景 使用代码 步骤1:创建ASP.NET Core Blazor服务器应用程序 运行测试应用程序 步骤2:安装软件包 步骤3:建立模型类别 创建服务类 步骤4:将服务添加到Startup ...

  5. python爬虫--Scrapy框架--Scrapy+selenium实现动态爬取

    python爬虫–Scrapy框架–Scrapy+selenium实现动态爬取 前言 本文基于数据分析竞赛爬虫阶段,对使用scrapy + selenium进行政策文本爬虫进行记录.用于个人爬虫学习记 ...

  6. IQueryable查询器扩展Expression动态排序

    IQueryable查询器扩展Expression动态排序 查询器扩展方法 分页类 查询器扩展方法 /// <summary>/// 获取分页排序列表/// </summary> ...

  7. soa框架_SOA之外:动态业务应用程序的新型框架-第二部分

    soa框架 第二部分–在实践中构建动态业务应用程序–两个自适应系统的故事 生产力的提高是提高生活水平的基石. 美国的经验表明,长期强劲的生产率增长的特征是技术创新,伴随着组织结构和商业融资安排的变化以 ...

  8. spring gateway 限流持久化_Spring Cloud Gateway 扩展支持动态限流

    之前分享过 一篇 <Spring Cloud Gateway 原生的接口限流该怎么玩>, 核心是依赖Spring Cloud Gateway 默认提供的限流过滤器来实现 原生Request ...

  9. python的unittest測试框架的扩展浅谈

    非常多时候測试框架须要依据測试数据来自己主动生成測试用例脚本,比方接口測试,通过不同參数构建组合去请求接口,然后验证返回结果.假设这样能通过配置excel数据来驱动測试.而不用去写一大堆的測试用例脚本 ...

  10. java动态网站框架_大型网站动态应用系统架构

    动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应用系统通常与数据库系统. ...

最新文章

  1. java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法...
  2. 三维家导入户型镜像怎么使用_【业】1分钟看懂三维家定制柜设计
  3. 文本去重之MinHash算法——就是多个hash函数对items计算特征值,然后取最小的计算相似度...
  4. python的图像傅里叶变换 np.fft.fft2 cv.dft 函数
  5. 非确定性算法_《长安十二时辰》背后的文娱大脑:如何提升爆款的确定性?
  6. 天使和恶魔差异只在一念之间
  7. 企业申请CMMI3-CMMI5必经的六个阶段
  8. 人工智能2021截稿日期_2019年136个国际学术会议资讯 (含截稿日期)
  9. easyweb前端框架的资料
  10. 数仓OLAP(一)--即席查询 Kylin
  11. tcpdump进行IP抓包
  12. 考研数学 曲线曲面积分
  13. linux服务上实现web在线编辑,利用 ONLYOFFICE 将在线文档编辑器集成到 Python Web 应用程序中 | Linux 中国...
  14. python获取地图上经纬度_Python获取各大地图平台经纬度数据,哪家的数据最准确?...
  15. python实现金字塔图案
  16. 3.Jenkins入门基础使用与Maven+SonarQube集成配置与实践
  17. CTF学习经验分享(Web方向)
  18. WiFi驱动(1)框架解析
  19. Oracle sql大于和小于号的转义写法
  20. 如何实现可靠UDP传输

热门文章

  1. DB2 9 根本(730 磨练)认证指南,第 3 部门: 谋面 DB2 数据(4)
  2. 2018.09.18 循环终止
  3. Web系统Login拦截器
  4. ionic3 教程(一)安装和配置
  5. Ruby——关于require与require_relative
  6. linux —— ubuntu 初次安装问题
  7. .NET之对接口和抽象类(二)
  8. WinForm 2.0 无代码DataGridView绑定
  9. vue router name命名规范_关于Vue项目微前端的实现
  10. python基础学习