抽取非基本驗證到規則檔案 A2D規則引擎

2022-02-08 04:28:15 字數 3233 閱讀 7383

基本驗證與業務驗證,基本驗證就是始終保持不變的驗證規則,可以通過如下硬編碼實現:

public

class

order

[required]

[stringlength(

30)]

public

string customer

[required(allowemptystrings=true

)] [stringlength(

50)]

public

string storeid

}

然後在用如下**validate, 把錯誤放到list中:

private

bool

validatebasicrule(order order)

return

true

; }

public

static

class

dataannotationhelper}}

return

errors;

}private

static

icustomtypedescriptor gettypedescriptor(type type)

}

然後說說業務規則的易變

saas程式,或者業務規則極其易變時,就要採用其他方法來做了,不可能每個公司都用設計模式分開寫(雖然也行,但是不方便,公司業務規則多了後,對這些規則**的管理就是很高的成本,而且要developer來負責)。所以要用規則檔案來分開規則的編寫,好處:

把修改的職責交給別人,比如專案經理、專案實施人員

**不需要重新編譯就能實現業務規則的修改

我們來解決下這個易變問題,假設有2公司:a和b。

a公司驗證規則:

基本驗證(就是order類的驗證規則的硬編碼)

b公司驗證規則:

基本驗證(同上) 

自定義驗證規則:無

如果用a2d規則引擎來解決的話,需要怎麼做呢?

第一步當然是編寫規則檔案,a公司的規則檔案:

declare

allowstores=["www.cnblogs.com", "www.cnblogs1.com", "www.cnblogs2.com"]

end declare

rule "test"

when

!_.contains(allowstores, entity.storeid)

then

errors.add("storeid", "storeid value not right")

end rule

由於b公司沒有自定義規則,因此不需要編寫相應的規則檔案

第二步,調整驗證邏輯,如下: 

public

class

orderservice : brokenrulesholder

private

bool

validatecompanyrule(order order)

if (tempbrokenrulesholder.brokenrules.count > 0

)

return

true

; }

private

bool

validatebasicrule(order order)

return

true

; }

}

brokenrule.cs**:

public

class

brokenrulesholder

}public

void add(string key, string

msg)

public

void addrange(liststring, string>>rules)

public

void

clearbrokenrules()

}

demo**已經更新到a2d框架中了,這裡就不upload執行圖了。

a2d規則引擎已經內嵌了underscore 

1.5.2,因此規則定義檔案(.r檔案)中可以寫相應的underscore函式來簡化寫法。

規則檔案說明:

declare

allowstores1=["www.cnblogs.com", "www.cnblogs1.com", "www.cnblogs2.com"]

allowstores2=["www.cnblogs.com", "www.cnblogs1.com", "www.cnblogs2.com"]

end declare

rule "rule 1"

when

!allowstores1.contains(entity.storeid)

then

errors.add("storeid", "storeid value not right")

end rule

rule "rule 2"

when

!allowstores2.contains(entity.storeid)

then

errors.add("storeid", "storeid value not right")

end rule

declare section:

可以不寫,但是最多只能存在1個這樣的section

每行可以有逗號,也可以沒有逗號

這個section的本意是:當前規則檔案的變數全域性定義、初始化工作

開頭為declare,小寫

結尾為end declare,小寫

rule section:

必須存在1到多個

每行可以有逗號,也可以沒有逗號

開頭為rule "一些描述",小寫

結尾為end rule,小寫

如果存在3個rule時,最終會變成這樣的js邏輯

載入underscore的js**

載入declare section的js**

if(rule1 conditions)

else

if(rule2 conditions)

else

if(rule3 conditions)

Kettle8 2實現抽取檔案到Hive

三 案例演示 四 總結 說明 說明 本案例使用hive本地模式,讀者自行安裝mysql 該案例使用mysql5.7,讀者自行選擇 安裝步驟 在hdfs建立目錄,執行如下命令 hdfs dfs mkdir p user pdi weblogs parse 上傳weblogs parse.txt到 us...

PHP檔案上傳基本驗證

html部分 lang en charset utf 8 檔案上傳title head action doupload.php method post enctype multipart form data type file name myfile type hidden name max fil...

C標頭檔案編寫基本規則

1.注釋,版權,作者,重大修訂記錄等資訊 2.防重入開關,也就是常見的 ifndef h 必須確保header guard巨集名永不重名 define h 標頭檔案內容 endif 3.c 編譯器自適應開關,也就是常見的 h檔案頭部 ifdef cplusplus extern c endif 4....