您的位置:首页 > 其它

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

2013-07-08 08:57 295 查看

背景

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

/article/4736829.html

/article/4736830.html

/article/4736831.html

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

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

一些常见的编号示例

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

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

xxxx年xxxx月xxxx日第x份销售订单,规则配置:<日期:yyyy年MM月dd日>第<种子:销售订单:yyyyMMdd>份销售订单。

测试代码

using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;

using Happy.Domain.CodeRule;
using Happy.Domain.CodeRule.Generators;

namespace Happy.Test.Doamin.CodeRule
{
[TestClass]
public class CodeRuleInterceptorTest
{
[TestMethod]
public void Intercept_Test()
{
var seedKey = "销售订单";
var file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Seeds", seedKey + ".txt");
if (File.Exists(file))
{
File.Delete(file);
}

var interceptor = new CodeRuleInterceptor();

interceptor
.RegisterInterceptor(new DateTimeCodeGeneratorInterceptor())
.RegisterInterceptor(new LiteralCodeGeneratorInterceptor())
.RegisterInterceptor(new SeedCodeGeneratorInterceptor(new FileSeedStore()));

var generator = interceptor.Intercept("前缀---<日期:yyyyMMdd>---中缀---<种子:销售订单>---后缀");

Assert.IsNotNull(generator);

Assert.AreEqual("前缀---20130705---中缀---00001---后缀", generator.Generate(new GenerateContext()));
Assert.AreEqual("前缀---20130705---中缀---00002---后缀", generator.Generate(new GenerateContext()));
Assert.AreEqual("前缀---20130705---中缀---00003---后缀", generator.Generate(new GenerateContext()));
}
}
}


常见问题

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

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

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

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;

using Happy.Domain.CodeRule;

namespace Happy.Test.Doamin.CodeRule
{
[TestClass]
public class FileSeedStoreTest
{
[TestMethod]
public void NextSeed_Test()
{
var seedKey = "销售订单";
var file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Seeds", seedKey + ".txt");
if (File.Exists(file))
{
File.Delete(file);
}

var seedStore = new FileSeedStore();

Assert.AreEqual(1, seedStore.NextSeed(seedKey));
Assert.AreEqual(2, seedStore.NextSeed(seedKey));
Assert.AreEqual(3, seedStore.NextSeed(seedKey));
}
}
}


备注

这种规则生成器,我在产品和项目中都有用过,新入门的朋友可以直接使用,高手要多提些意见。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: