目標(biāo)
這個(gè)工具的目標(biāo)是能夠在項(xiàng)目初期快速搭建一個(gè)“數(shù)據(jù)提供器”,快速的為前端提供數(shù)據(jù)支撐,從而方便項(xiàng)目定型;當(dāng)然,或許這不是一個(gè)正確的開發(fā)流程。不過存在決定方法,這里不討論理想情況?;谶@個(gè)目標(biāo),目前有兩種方式:
- 基于“倉儲(chǔ)”的“偽實(shí)現(xiàn)”。由于項(xiàng)目框架中進(jìn)行了倉儲(chǔ)隔離,所以可以考慮為倉儲(chǔ)提供一個(gè)“數(shù)據(jù)池”,在忽略業(yè)務(wù)的情形下快速提供數(shù)據(jù)?;贗oC的思想,這種實(shí)現(xiàn)中,業(yè)務(wù)層必須不曉得“假數(shù)據(jù)”的存在。所以不能讓和這個(gè)組件相關(guān)的任何信息、任何代碼傾入業(yè)務(wù)。也就是說,不能使用聲明式的方案,得使用類似于EF的Map的方案。
- 基于“應(yīng)用程序?qū)印钡摹皞螌?shí)現(xiàn)”。第一個(gè)方案的缺點(diǎn)是仍然不夠快,需要編寫一定量的代碼。所以第二個(gè)方案的特點(diǎn)是,全部基于Attribute聲明,快速確定前后端需要傳輸?shù)臄?shù)據(jù)類型。因?yàn)檫@些定義的數(shù)據(jù)類型屬于DTO,也沒有必要去清理這些定義好的Attribute——而且,如果設(shè)計(jì)得當(dāng)?shù)脑挘耆梢詫⑦@些Attribute作為數(shù)據(jù)驗(yàn)證的依據(jù)。
選擇
總的來說就是兩個(gè)選擇,要么自己實(shí)現(xiàn),要么站在前人的基礎(chǔ)上調(diào)整。
在Nuget上搜索了下Data Generater,發(fā)現(xiàn)不少的匹配項(xiàng)。找了其中一個(gè)下載量比較大的:
細(xì)看了下文檔,感嘆群眾的眼睛果然是雪亮的。
擴(kuò)展
Bogus完全符合[目標(biāo)]這一節(jié)的第一點(diǎn)要求,但是沒有發(fā)現(xiàn)基于Attribute的使用方式。所以決定自己擴(kuò)展下。Bogus的配置入口是一個(gè)泛型類:Faker<>,配置方法是RuleFor,這個(gè)方法包含了2個(gè)重載,而且都是兩個(gè)參數(shù)的。第一個(gè)參數(shù)都是一個(gè)MemberAccess的Lambda Expression,這個(gè)參數(shù)指示了你希望針對哪個(gè)屬性配置。第二個(gè)參數(shù)是一個(gè)委托,指示了你希望如何返回值。該組件的Faker(非泛型)類型提供了豐富的數(shù)據(jù)提供方式。這也是這個(gè)組件最大的價(jià)值所在。以下是摘自GitHub的幾個(gè)例子:
var testUsers = new Faker<User>() //Optional: Call for objects that have complex initialization .CustomInstantiator(f => new User(userIds++, f.Random.Replace("###-##-####"))) //Ba