天天看點

MVC與單元測試實踐之健身網站(二)-管理者子產品

開始動手做這個項目時,發現無法做到完全的先設計、再編碼,于是決定分子產品進行,從管理者子產品開始設計、編碼,而且接口就已經改了好幾次了。

管理者子產品涉及的功能有登入和背景對管理者的維護,其中也涉及前端的開發。UI模闆使用Inspinia,感覺這套模闆功能豐富、界面美觀,而且基于HTML5和BootStrap,對這兩方面的知識也可以多些了解。

在上一篇<如何在單元測試時隔離ORM>中,解決了對Service層進行測試怎樣建構僞對象的問題,随後管理者子產品的Service層和單元測試在齊頭并進中完成了;前端基于模闆套出的界面也好了。

背景登入界面:

MVC與單元測試實踐之健身網站(二)-管理者子產品

首頁:

MVC與單元測試實踐之健身網站(二)-管理者子產品

管理者的維護尚未完成,這兒記錄兩個之前遇到的問題:HTML5表單的異步送出驗證以及關于Autofac待注入對象的初始化的一個問題。

一 HTML5表單的異步送出驗證

a) 表單驗證

本來計劃表單的驗證使用ValidForm元件,但遇到了一些莫名其妙無法解決的樣式問題,隻好使用HTML5自帶的表單驗證,直接支援email、url等的校驗,但對浏覽器有限制

MVC與單元測試實踐之健身網站(二)-管理者子產品

另外,即使浏覽器支援,但感覺驗證并不嚴密,比如郵箱輸入類似email@abc竟然也可以通過驗證,是以還是自己寫正規表達式靠譜。非空校驗要單獨添加required屬性。

b) 表單異步送出

HTML5原生的校驗顔色比ValidForm漂亮,但之前隻知道需要點選submit按鈕才能觸發校驗,這是放棄原生校驗嘗試ValidForm的直接原因,但ValidForm搞不定後,隻好尋求HTML異步送出的方法,其實很友善:

MVC與單元測試實踐之健身網站(二)-管理者子產品

在注冊的$("#formLogin").submit方法中,使用$(this).ajaxSubmit(options)替換了點選submit時的事件行為,進行ajax異步送出。

二 關于Autofac,在待注入對象的構造函數需要參數時的配置問題

為了在對Service層的單元測試時隔離EF,在Service層和EF操作之間增加了IRepositoty接口及其實作,在初始化AdminUserService時要在其構造函數中傳遞AdminUserRepository參數

MVC與單元測試實踐之健身網站(二)-管理者子產品

在單元測試時可以手工傳遞,但在Controller中注入AdminUserService時卻不能這樣做了,需要配置Autofac在初始化AdminUserService要使用的IRepository<AdminUserEntity>對象。

MVC與單元測試實踐之健身網站(二)-管理者子產品

在AutofacConfig的代碼中,最簡單的情況是隻需要注冊Controller和IService接口的實作類,現在則還需要注冊以Reposiroty結尾的類(a.Name.EndsWith("Repository")),因為這裡規定實作IRepository的類統一以” Repository”結尾,然後通過builder.Register(a => new AdminUserService( (IRepository<AdminUserEntity>)a.Resolve(typeof(IRepository<AdminUserEntity>))))來配置Autofac在初始化AdminUserService類時為構造函數傳遞的參數為IRepository<AdminUserEntity>。采用這種配置方式的話,意味着後續每當增加新的Service類時都要回到這兒建立手動映射,顯然有點不便,應該有更簡便的方法有待試驗。