生活随笔
收集整理的這篇文章主要介紹了
转载CSDN (MVC WebAPI 三层分布式框架开发)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言:SOA(面向服務的架構)是目前企業應用開發過程中普遍采用的技術,基于MVC WebAPI三層分布式框架開發,以此適用于企業信息系統的業務處理,是本文論述的重點。此外,插件技術的應用,富客戶端JQuery實現技術,本文也對其具體實現做以說明。相關示例解決方案可以參考GitHub資源,在文章結尾給出。
?
1.?系統分層體系架構設計
?
分布式三層系統簡單分為數據訪問層,業務邏輯層和前端展現層。分層架構設計是構建大型分布式系統的必要手段,因為可以使得系統健壯,可擴展。
?
SOA即面向服務的架構,可以幫助企業構建靈活,擴展性強的復雜業務系統,按照服務的理念進行功能交付,調用方也不用去知道實現一方的具體細節;雙方是按照統一消息格式,接口方式進行交互的。
SOA的實現是基于以Web服務的方式發布Api接口,目前WebAPI是一種Restfule形式的Web服務,相比WCF的復雜性,WebAPI的開發效率更高,而且在配置時也不需要客戶端和服務端的xml配置。
企業核心業務數據可以讓桌面、Web、平板、手機或物聯設備訪問,所以需要統一API接口,WebApi作為業務邏輯處理服務能夠滿足接口訪問和接口之間交互的需求。
2.基礎類庫模塊 2.1 數據訪問:Dapper-微型ORMapping框架 Dapper的優勢: 1,Dapper是一個輕型的ORM類。代碼就一個SqlMapper.cs文件,編譯后就40K的一個很小的Dll. 2,Dapper很快。Dapper的速度接近與IDataReader,取列表的數據超過了DataTable。 3,Dapper支持Mysql,SqlLite,Mssql,Oracle等一系列的數據庫,當然如果你知道原理也可以讓它支持Mongo db 4,Dapper的r支持多表并聯的對象。支持一對多 多對多的關系。并且沒侵入性,想用就用,不想用就不用。無XML無屬性。代碼以前怎么寫現在還怎么寫。 5,Dapper原理通過Emit反射IDataReader的序列隊列,來快速的得到和產生對象。性能實在高。 6,Dapper 是C#實現,支持.net framework 各種版本;
7,Dapper語法十分簡單。并且無須遷就數據庫的設計。
?
?
國外大型網站采用的有: –StackOverflow,?StackExcahnge等。。。
?
讀取500條記錄,并做簡單對象的序列化操作時間對比如下圖:
?
2.2 DataRepository類
?
?實現數據實體操作封裝 -Insert—插入 -Update—更新 -Delete—刪除 -Select—選取 -Paged—分頁 2.3 ?ServiceBase類 ?實現業務實體對象的操作封裝 –Insert—插入 –Update—更新 –Delete—刪除 –Select—選取 –Paged—分頁 ?
2.4 服務實現類
?
-實現Iservice接口 -繼承ServiceBase基類 2.5 WebAPI服務發布 API Controller:
??? --[HttpGet]
??? --[HttpPost]
??? --[HttpPut]
??? --[HttpDelete]
2.6 動態加載插件 -系統的擴展性 -系統的變化性 -客戶二次開發 -MEF –運行時加載 2.7 AutoMapper—實體對象之間轉換 ?兩個實體類 –EPProduct –?數據實體 –Product–?業務實體 ?轉化示例代碼 –EPProduct?p =ProductRepository.Get(long.Parse(id)); –AutoMapper.Mapper.CreateMap<EPProduct, Product>(); –Productentity =AutoMapper.Mapper.Map<EPProduct, Product>(p) 2.8 面向接口編程--Ioc框架 ?SimpleInjector –靜態類型 –編譯階段 ?MEF –動態類型 –運行時階段 3.富客戶端開發 3.1 Asp.NETMVC?富客戶端開發 ?Model –WebAPI (服務接口) ?Controller –路由 ?View –頁面 – ?富客戶端 –Ajax 局部刷新 – 鼠標、鍵盤響應事件等 –如Gmail郵箱等應用示例 3.2?Jquery插件 ?Layout—Jquery Layout ?DataGrid – SlickGrid –性能非常高 ?Tree– Jstree/Ztree –評價都不錯 ?Tab– Jquery Tools ?Toolbar– Jquery Tools ?Dialog– Jquery Tools ?Form–Jquery Tools 3.3?前端頁面Ajax調用: GET/POST/PUT/DELETE [javascript]?view plaincopy
?????????$.doHttpClientGet?=?function(url,?fn)?{?????????$.getJSON(url,?fn);?????}??????????????????$.doHttpClientUpdate?=?function(url,?data,?fn)?{?????????$.ajax({?????????????url:?url,?????????????type:?'PUT',?????????????data:?data,?????????????dataType:?'json',?????????????contentType:?'application/json',?????????????success:?fn?????????});?????}??????????????????$.doHttpClientDelete?=?function(url,?data,?fn)?{?????????$.ajax({?????????????url:?url,?????????????type:?'DELETE',?????????????data:?data,?????????????dataType:?'json',?????????????contentType:?'application/json',?????????????success:?fn?????????});?????}??????????????????$.doHttpClientSave?=?function(url,?data,?fn)?{?????????$.ajax({?????????????url:?url,?????????????type:?'POST',?????????????data:?data,?????????????dataType:?'json',?????????????contentType:?'application/json',?????????????success:?fn?????????});?????}??????????????????$.doAjaxGet?=?function(url,?fn)?{??????????????????$.ajax({?????????????url:?url,?????????????type:?"GET",?????????????dataType:?'json',??????????????????????????contentType:?'application/json',?????????????success:?fn?????????});?????}?????????$.doAjaxPost?=?function(url,?data,?fn)?{?????????$.ajax({?????????????url:?url,?????????????type:?'POST',?????????????data:?data,?????????????dataType:?'json',?????????????contentType:?'application/json',?????????????success:?fn?????????});?????}??????????????$.buildHTML?=?function(tag,?html,?attrs)?{??????????????????if?(typeof?(html)?!=?'string')?{?????????????attrs?=?html;?????????????html?=?null;?????????}?????????var?h?=?'<'?+?tag;?????????for?(attr?in?attrs)?{?????????????if?(attrs[attr]?===?false)?continue;?????????????h?+=?'?'?+?attr?+?'="'?+?attrs[attr]?+?'"';?????????}?????????return?h?+=?html???">"?+?html?+?"</"?+?tag?+?">"?:?"/>";?????}??????????????$.fn.buildJsTree?=?function?(url,?fn)?{?????????var?object?=?require(['jstree'],?function(){?????????????$.jstree._themes?=?"/PlatJS/Scripts/jstree/themes/";?????????????var?myTree?=?$(this).jstree({?????????????????"json_data":?{?????????????????????"ajax":?{?????????????????????????"url":?url,?????????????????????????"type":?"GET",?????????????????????????"dataType":?"json",?????????????????????????"contentType":?"application/json?charset=utf-8",?????????????????????????"success":?fn?????????????????????}?????????????????},?????????????????"plugins":?["themes",?"json_data",?"ui"]?????????????});?????????})?????}?? 3.4?如何調試? ?Fiddler--
*****5star FireBug?for Firefox
?查看HTML,CSS,Javascript等 ?監控下載圖片資源時間線 ?完善友好的調試 Firefox的RestClient插件—Rest Client測試插件
http://localhost:8081/ProductSys.WebAPI/api/order/insertwith?type="insertwith“
?[HttpPost]
public?HttpResponseMessageInsertWith(Order entity, string type)
http://localhost:8081/ProductSys.WebAPI/api/order/4
?[HttpDelete]
?public?HttpResponseMessage?Delete(string id)
?
?
3.5 Web異常錯誤代碼
?
?100-199– Informational ?200-299– Client request successful ?300-399– Client request redirected, further action necessary ?400-499– Client request incomplete ?500-599– Server error 4.?Javascript 類語法 4.1 常見問題 ?Namespace(命名空間) –默認為全局范圍,有潛在類型沖突隱患 ?SelfExecuting Fuction (自執行匿名函數) ?Objectand Array (對象和數組初始化) –不要使用new?關鍵字 ?NullOr Empty (檢查NULL) ?
4.2 Javascript-自執行匿名函數 [javascript]?view plaincopy
??(function(?skillet,?$,?undefined?)?{????????????var?isHot?=?true;???????????????skillet.ingredient?=?"Bacon?Strips";???????????????????skillet.fry?=?function()?{??????????var?oliveOil;?????????????????????addItem(?"\t\n?Butter?\n\t"?);??????????addItem(?oliveOil?);??????????console.log(?"Frying?"?+?skillet.ingredient?);??????};???????????????????function?addItem(?item?)?{??????????if?(?item?!==?undefined?)?{??????????????console.log(?"Adding?"?+?$.trim(item)?);??????????}??????}??????}(?window.skillet?=?window.skillet?||?{},?jQuery?));???<pre?name="code"?class="javascript">??console.log(?skillet.ingredient?);????????skillet.fry();????????skillet.quantity?=?"12";??console.log(?skillet.quantity?);????????(function(?skillet,?$,?undefined?)?{????????????var?amountOfGrease?=?"1?Cup";???????????????????skillet.toString?=?function()?{??????????console.log(?skillet.quantity?+?"?"?+????????????????????????skillet.ingredient?+?"?&?"?+????????????????????????amountOfGrease?+?"?of?Grease"?);??????????console.log(?isHot???"Hot"?:?"Cold"?);??????};??????}(?window.skillet?=?window.skillet?||?{},?jQuery?));?????try?{????????????skillet.toString();???}?catch(?e?)?{??????console.log(?e.message?);???}</pre><pre?name="code"?class="javascript"></pre>?? 4.3 對象和數組初始化 [javascript]?view plaincopy
??var?person?=?{},???????keys?=?[];??????var?person?=?{??????????firstName:?"Elijah",??????????lastName:?"Manor",??????????sayFullName:?function()?{??????????????console.log(?this.firstName?+?"?"?+???????????????????this.lastName?);??????????}??????},???????keys?=?["123",?"676",?"242",?"4e3"];?? 4.4 判斷對象是否為NULL(c#) [csharp]?view plaincopy
??if?(?someString?!=?null?&&??????someString.length?>?0?)?{????????}??????if?(?!string.IsNullOrEmpty(someString)?)?{????????}?? 4.5 判斷對象是否為NULL(javascript) [javascript]?view plaincopy
Javascript中的正確寫法??????if?(?someString?)?{????????}?? 4.6 設置缺省值(c#) [csharp]?view plaincopy
<span?style="color:?rgb(255,?0,?0);">??if?(?someString?==?null?)?{?????someString?=?"default?Value";??}????someString?=?someString???someString?:?"default?value";?<pre?name="code"?class="javascript">請在Javascript按如下格式寫????someString?=?someString?||?"default?value";??</pre><br>??<pre></pre>??<pre></pre>??<pre></pre>??<pre></pre>??<pre></pre>??<pre></pre>??<pre></pre>??<pre></pre>??<pre></pre>??<pre></pre>??<pre></pre>?? 4.7 不同類型的比較操作符(==, !=) ?// Unexpected Comparisons using the== Operator ?0?????????==? ''??????? //true ?0?????????==? '0'?????? //true ?false?????==? '0'?????? //true ?null??????==? undefined //true ?'\t\r\n ' ==? 0???????? //true 4.8?不同類型的比較操作符(===, !==) ?// Expected Comparisons using the ===Operator ?0?????????=== ''??????? //false ?0?????????=== '0'?????? //false ?false?????=== '0'?????? //false ?null??????=== undefined //false ?'\t\r\n ' === 0???????? //false 4.9?不可取的數組遍歷操作符for…in [csharp]?view plaincopy
var?myArray?=?[],?name;??myArray[5]?=?"test";??console.log(?myArray.length?);??????for?(?name?in?myArray?)?{??????console.log(?name,?myArray[name]?);??????????????}?? 4.10 正確的數組遍歷操作符for…;…;
[javascript]?view plaincopy
var?myArray?=?[],?name;??myArray[5]?=?"test";??console.log(?myArray.length?);??????for?(?var?i?=?0,?length?=?myArray.length;?i?<?length;?i++?)?{??????console.log(?i,?myArray[i]?);????????????????????????????????????????????}?? [javascript]?view plaincopy
for?(?var?name?in?object?)?{????????}????????for?(?var?name?in?object?)?{?????if?(?object.hasOwnProperty(name)?)?{?????????????}??}?? 5. RequireJS 模塊化腳本 RequireJS 是一個非常小巧的 JavaScript 模塊載入框架,是 AMD 規范最好的實現者之一。最新版本的 RequireJS 壓縮后只有 14K,堪稱非常輕量。它還同時可以和其他的框架協同工作,使用 RequireJS 必將使的前端代碼質量得以提升。 RequireJS 作為 JavaScript 文件的加載器,還是可以完成異步非阻塞的文件加載。 [javascript]?view plaincopy
define(['Controllers/Main/ListView'],?function?(ListView)?{??????function?start()?{??????????var?users?=?JSON.parse(localStorage.users);??????????ListView.render({?users:?users?});??????}????????return?{??????????start:?start??????};??});?? 6. 網絡資源 6.1 NuGet—快捷獲取軟件包 ?充分利用開源軟件包,避免重復制造輪子; ?也可以自己發布軟件包,回饋社區,先進技術的積累可以節約項目成本。 6.2 技術資源 ?Asp.net MVC WebAPI –RestfulWeb Service的發展 ?Jquery –官網 –插件開發 ?RequrieJS –Javascript模塊化開發框架 ?Dapper –微型ORMapping 框架 ?EntityFramework –Microsoft實體框架 7. 總結: 本文基于MVC WebAPI實現分布式三層架構,實現了通用數據訪問操作,業務實體和數據實體的交互操作,業務模塊之間的接口交互;實現了插件化的加載技術。此外限于篇幅,對于流程化的設計,會在下文論述,主要會談及到工作流Api和WebApi的交互。 代碼示例說明:
提供的示例RequireMVC199中,可以看一下ProductSys.WebApi的服務層代碼,前端代碼看RequireMvc199的WebApplication項目即可。
?
完整示例,可以看一下ProductList頁面的代碼,這個示例是完整的,包括文件:
WebApplication 包括:
\Controllers
? ? --ProductController.cs
\ViewJS
? \Controllers
? ? \Product
? ? ? ?--product-list.js
? ? ? --product-detail.js
?
\Views
? \Product
? ? --productlist.cshtml
?
WebApi 包括:
ProductSys.WebApi
? \Controllers
? ? --ProductController.cs
?
ProductSys.ServiceImp
? \Service
? ? --ProductService.cs
解決方案下載地址: https://github.com/lgsky/Plat2012
轉載于:https://www.cnblogs.com/johnwood/p/3456029.html
總結
以上是生活随笔為你收集整理的转载CSDN (MVC WebAPI 三层分布式框架开发)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。