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