堅持與保持熱情是一件很難的事,說實話有時候我也會質疑現在去深入學習一些技術有沒有用,因為心態有時候會太浮躁,為什么要談這個呢,因為從去年開始我聽到最多的就是這些問題。
工作
簡單先說說項目都用了哪些技術吧。
一.ASP.NET MVC
網站使用ASP.NET MVC 開發效率相對還是蠻快的,比如有如下的特性
1.使用模型的聲明式驗證 ,簡化了表單驗證
2.Razor視圖或單獨使用RazorEngine
3.攔截器 我習慣這樣稱呼,因為之前springmvc一般這樣稱呼,比如做一個自動登錄的驗證[cookies],全局的日志記錄等
4.路由也是蠻重要的一個東西,特別是對有潔癖的開發人員來說,比如你就是喜歡要每一個訪問的URL都要簡短並且有意義,或SEO實現類似/shanghai的URL等等(開始mvc4試了特性路由 http://attributerouting.net/),ASP.NET MVC 5.1 后已經支持,調試路由的工具 Install-Package routedebugger 等
5.返回匿名類JSON,局部視圖,擴展htmlhelper等等,這個功能非常方便,可以自定義擴展自己的方法
6.緩存 使用MvcDonutCaching ,功能還比原生的多一些,基本一致,另外緩存服務Redis或Couchbase
7.js與css的合並壓縮,Bundle 確實要方便很多,無需管理js的合並與樣式版本號問題
8.日志 使用了NLog個人感覺要筆log4j好很多,錯誤與異常級別記錄文本,window事件,db,email,基本滿足需求,另外Elman也是蠻好用
9.XSS 使用了AntiXSS,ValidateAntiForgeryToken 另外就是寫代碼的時候多注意
10.頁面性能,使用 MiniProfiler [http://www.asp.net/mvc/overview/performance/profile-and-debug-your-aspnet-mvc-app-with-glimpse]檢查調試頁面性能,貌似有時候會與 routedebugger 的樣式混亂
二. WEBAPI
APP的接口與一些常用的接口之前是使用WCF的Rest,后面感覺比較臃腫,就換成了WEBAPI, 個人非常喜歡這個,相比WCF比較輕量,好擴展,相比ASP.NET MVC我改進了一點東西
1.使用Autofac作為IOC容器
2.使用特性路由定義接口URL
3.使用markdown書寫接口文檔
5.全局攔截器對參數約束驗證
6.自動生成/help參數文檔 Install-Package Microsoft.AspNet.WebApi.HelpPage
7.支持跨越訪問 Install-Package Microsoft.AspNet.WebApi.Cors
8.路由調試 WebApiRouteDebugger 執行過程跟蹤 Install-Package Microsoft.AspNet.WebApi.Tracing Update-Package Microsoft.AspNet.WebApi.WebHost
9.另外推薦個HTTP類庫Flurl.Http個人感覺要比.NET 4.5自帶的HttpClient要好用,支持Task異步 ;擴展方法 Z.ExtensionMethods類庫,包含大多數常用的擴展方法
例:
/// <summary> /// 測試業務異步回調接口是否正確 /// </summary> /// <param name="notifyUrl">業務服務地址</param> /// <returns></returns> [HttpPost] [Route("notify")] public async Task<IHttpActionResult> PostJsonAsync(string notifyUrl) { if (notifyUrl.IsNullOrEmpty() || !notifyUrl.Contains("http", StringComparison.OrdinalIgnoreCase)) return Ok(new { IsError = true, Msg = "NotifyUrl IS EMPTY", Data = string.Empty }); //notifyUrl = notifyUrl.UrlDecode(System.Text.Encoding.UTF8); var payPal = new PayPalData { UserID = "test", Subject = "測試異步回調接口", OutTradeNO = "10086", CreateTime = DateTime.Now, GuidNO = Guid.NewGuid().ToString(), TotalFee = "0.01", Origin = "WEB" }; try { var data = await notifyUrl.PostJsonAsync(payPal).ReceiveJson<WebAPIResponse>(); logger.Info("PayPalController JsonAsync : " + payPal.SerializeJson(System.Text.Encoding.UTF8)); if (data.IsError) { return Ok(new { IsError = true, Msg = data.Msg, Data = data.Data }); } return Ok(new { IsError = false, Msg = string.Empty, Data = payPal.SerializeJson(System.Text.Encoding.UTF8) }); } catch (Exception ex) { return Ok(new { IsError = true, Msg = "PostJsonAsync Exception : " + ex.Message, Data = payPal.SerializeJson(System.Text.Encoding.UTF8) }); } }
列:Filter
/// <summary> /// http://www.asp.net/web-api/overview/formats-and-model-binding/model-validation-in-aspnet-web-api /// http://www.asp.net/web-api/overview/error-handling/exception-handling /// </summary> public class ModelValidFilter : ActionFilterAttribute { /// <summary> /// 模型驗證 /// </summary> /// <param name="actionContext"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public override Task OnActionExecutingAsync(HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken) { if (actionContext.ActionArguments.Values.FirstOrDefault().IsNull()) { var data = new { IsError = true, Msg = "參數不能為空!", Data = string.Empty }; actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, data); return base.OnActionExecutingAsync(actionContext, cancellationToken); } if (!actionContext.ModelState.IsValid) { // 注意 !!!!: http://tmenier.github.io/Flurl/fluent-http/ HttpStatusCode.BadRequest var data = new { IsError = true, Msg = actionContext.ModelState.Values.FirstOrDefault().Errors.FirstOrDefault().ErrorMessage, Data = actionContext.ModelState.Keys.FirstOrDefault() + " :參數驗證有誤!!!" }; actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, data); return base.OnActionExecutingAsync(actionContext, cancellationToken); } return base.OnActionExecutingAsync(actionContext, cancellationToken); } }
另外推薦一個開源的Markdown編輯器 https://pandao.github.io/editor.md/ ,可以集成到項目中,寫寫接口文檔。
三.StackExchange Dapper
推薦StackExchange的兩款開源項目 StackExchange.Redis (https://github.com/StackExchange/StackExchange.Redis) 與 Dapper
使用Dapper,操作數據庫的代碼相比更簡潔 ,同時也支持.NET 4.5 Task異步 ,示例具體git下來看下單元測試 https://github.com/StackExchange/dapper-dot-net ,不過要主要Dapper下的一個與MSSQL執行計划的問題
Be careful with varchars in Dapper :http://www.codeproject.com/Articles/594133/BepluscarefulpluswithplusvarcharsplusinplusDapper
四. Quartz
使用了Quartznet,寄宿window服務,運行一直很穩定。如果想不想使用服務方式可以試試 Install-Package Hangfire 可以集成MVC或OWIN等。
活動
杭JS2014
去年參加了杭JS2014 ,基本就是分享一些關於nodejs相關的東西,不得不說阿里不僅僅是JAVA帝國還是前端江湖的締造者。
杭JS - 2014 JavaScript中國開發者大會: 2014-6-21 ~ 22
https://cnodejs.org/topic/53473dde502e5602740078bc
2014 杭JS大會 會議盛況與技術熱點現場報道(直播)
http://segmentfault.com/a/1190000000584556
杭JS 2014 演講視頻合集
https://cnodejs.org/topic/53bbc408a3ccaece73467f11
PyConChina 2014
PyCon2014 這個票是gitcafe送的,一些主題 linux的線程 協程 回調與上下文切換; py與機器學習很厲害的樣子;golang 的nsq消息列隊
shanghai-osc-meeting-2014
shanghai-osc-meeting the docker way;go的持續集成
OSC上海源創會
http://115.29.174.111/shanghai-osc-meeting/
搭建服務
后面我還搭建了基於一個nodejs博客:http://115.29.174.111/ 與基於golang的git服務:http://115.29.174.111:3000/
現在
碼了這么多字,都是一些零碎的東西,感覺也沒啥主題,就是記錄一些經歷過程。