前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理,是本文论述的重点。此外,插件技术的应用,富客户端JQuery实现技术,本文也对其具体实现做以说明。相关示例解决方案可以参考GitHub资源,在文章结尾给出。

http://blog.csdn.net/besley/article/details/8479943

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
  1. /***
  2. * HttpGet获取服务端数据
  3. * @url 业务数据
  4. * @data
  5. */
  6. $.doHttpClientGet = function(url, fn) {
  7. $.getJSON(url, fn);
  8. }
  9. /***
  10. * HttpPut更新数据到服务端
  11. * @url 业务数据
  12. * @data
  13. */
  14. $.doHttpClientUpdate = function(url, data, fn) {
  15. $.ajax({
  16. url: url,
  17. type: 'PUT',
  18. data: data,
  19. dataType: 'json',
  20. contentType: 'application/json',
  21. success: fn
  22. });
  23. }
  24. /***
  25. * HttpDelete删除数据
  26. * @url 业务数据
  27. * @data
  28. */
  29. $.doHttpClientDelete = function(url, data, fn) {
  30. $.ajax({
  31. url: url,
  32. type: 'DELETE',
  33. data: data,
  34. dataType: 'json',
  35. contentType: 'application/json',
  36. success: fn
  37. });
  38. }
  39. /***
  40. * HttpPost保存数据
  41. * @url 业务数据
  42. * @data
  43. */
  44. $.doHttpClientSave = function(url, data, fn) {
  45. $.ajax({
  46. url: url,
  47. type: 'POST',
  48. data: data,
  49. dataType: 'json',
  50. contentType: 'application/json',
  51. success: fn
  52. });
  53. }
  54. /***
  55. * ajax获取服务端数据
  56. * @url 业务数据
  57. * @data
  58. */
  59. $.doAjaxGet = function(url, fn) {
  60. //$.getJSON(url, fn);
  61. $.ajax({
  62. url: url,
  63. type: "GET",
  64. dataType: 'json',
  65. //data: data,
  66. contentType: 'application/json',
  67. success: fn
  68. });
  69. }
  70. $.doAjaxPost = function(url, data, fn) {
  71. $.ajax({
  72. url: url,
  73. type: 'POST',
  74. data: data,
  75. dataType: 'json',
  76. contentType: 'application/json',
  77. success: fn
  78. });
  79. }
  80. //构造html的通用方法
  81. $.buildHTML = function(tag, html, attrs) {
  82. // you can skip html param
  83. if (typeof (html) != 'string') {
  84. attrs = html;
  85. html = null;
  86. }
  87. var h = '<' + tag;
  88. for (attr in attrs) {
  89. if (attrs[attr] === false) continue;
  90. h += ' ' + attr + '="' + attrs[attr] + '"';
  91. }
  92. return h += html ? ">" + html + "</" + tag + ">" : "/>";
  93. }
  94. //构造JsTree的通用方法
  95. $.fn.buildJsTree = function (url, fn) {
  96. var object = require(['jstree'], function(){
  97. $.jstree._themes = "/PlatJS/Scripts/jstree/themes/";
  98. var myTree = $(this).jstree({
  99. "json_data": {
  100. "ajax": {
  101. "url": url,
  102. "type": "GET",
  103. "dataType": "json",
  104. "contentType": "application/json charset=utf-8",
  105. "success": fn
  106. }
  107. },
  108. "plugins": ["themes", "json_data", "ui"]
  109. });
  110. })
  111. }

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-自执行匿名函数

  1. //Self-Executing Anonymous Func: Part 2 (Public & Private)
  2. (function( skillet, $, undefined ) {
  3. //Private Property
  4. var isHot = true;
  5. //Public Property
  6. skillet.ingredient = "Bacon Strips";
  7. //Public Method
  8. skillet.fry = function() {
  9. var oliveOil;
  10. addItem( "\t\n Butter \n\t" );
  11. addItem( oliveOil );
  12. console.log( "Frying " + skillet.ingredient );
  13. };
  14. //Private Method
  15. function addItem( item ) {
  16. if ( item !== undefined ) {
  17. console.log( "Adding " + $.trim(item) );
  18. }
  19. }
  20. }( window.skillet = window.skillet || {}, jQuery ));
  21. <pre name="code" class="javascript">//Public Properties
  22. console.log( skillet.ingredient ); //Bacon Strips
  23. //Public Methods
  24. skillet.fry(); //Adding Butter & Fraying Bacon Strips
  25. //Adding a Public Property
  26. skillet.quantity = "12";
  27. console.log( skillet.quantity ); //12
  28. //Adding New Functionality to the Skillet
  29. (function( skillet, $, undefined ) {
  30. //Private Property
  31. var amountOfGrease = "1 Cup";
  32. //Public Method
  33. skillet.toString = function() {
  34. console.log( skillet.quantity + " " +
  35. skillet.ingredient + " & " +
  36. amountOfGrease + " of Grease" );
  37. console.log( isHot ? "Hot" : "Cold" );
  38. };
  39. }( window.skillet = window.skillet || {}, jQuery ));
  40. try {
  41. //12 Bacon Strips & 1 Cup of Grease
  42. skillet.toString(); //Throws Exception
  43. } catch( e ) {
  44. console.log( e.message ); //isHot is not defined
  45. }</pre><pre name="code" class="javascript"></pre>
 
4.3 对象和数组初始化
  1. //建议申明对象或数组的写法
  2. var person = {},
  3. keys = [];
  4. //申明复杂对象或数组的写法
  5. var person = {
  6. firstName: "Elijah",
  7. lastName: "Manor",
  8. sayFullName: function() {
  9. console.log( this.firstName + " " +
  10. this.lastName );
  11. }
  12. },
  13. keys = ["123", "676", "242", "4e3"];

4.4 判断对象是否为NULL(c#)

  1. // <span style="color:#ff0000;">C# 例子. 不要在Javascript中这样写</span>
  2. if ( someString != null &&
  3. someString.length > 0 ) {
  4. //Do something here...
  5. }
  6. // C# 例子 检查字符串是否为空
  7. if ( !string.IsNullOrEmpty(someString) ) {
  8. //Do something here...
  9. }

4.5 判断对象是否为NULL(javascript)

  1. Javascript中的正确写法
  2. // Simplified JavaScript syntax to check for
  3. // undefined, null, & empty string values
  4. if ( someString ) {
  5. //Do something here...
  6. }

4.6 设置缺省值(c#)

 
  1. <span style="color: rgb(255, 0, 0);">// C# 例子,不要在Javascript这样写</span>
  2. if ( someString == null ) {
  3. someString = "default Value";
  4. }
  5. // Slightly better, but don't do this either
  6. someString = someString ? someString : "default value"; <pre name="code" class="javascript">请在Javascript按如下格式写
  7. // JavaScript syntax to set a default value
  8. someString = someString || "default value";
  9. </pre><br>
  10. <pre></pre>
  11. <pre></pre>
  12. <pre></pre>
  13. <pre></pre>
  14. <pre></pre>
  15. <pre></pre>
  16. <pre></pre>
  17. <pre></pre>
  18. <pre></pre>
  19. <pre></pre>
  20. <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

  1. var myArray = [], name;
  2. myArray[5] = "test";
  3. console.log( myArray.length ); //6
  4. for ( name in myArray ) {
  5. console.log( name, myArray[name] );
  6. //Outputs...
  7. //   5, test
  8. }

4.10 正确的数组遍历操作符for…;…;

  1. var myArray = [], name;
  2. myArray[5] = "test";
  3. console.log( myArray.length ); //6
  4. for ( var i = 0, length = myArray.length; i < length; i++ ) {
  5. console.log( i, myArray[i] );
  6. //Outputs...
  7. //   0, undefined
  8. //   1, undefined
  9. //   2, undefined
  10. //   3, undefined
  11. //   4, undefined
  12. //   5, test
  13. }
  1. for ( var name in object ) {
  2. //Your code here
  3. }
  4. /* Check if object has property before
  5. iterating, because functions inherited
  6. from prototype are also included */
  7. for ( var name in object ) {
  8. if ( object.hasOwnProperty(name) ) {
  9. //Your code here
  10. }
  11. }
 
5. RequireJS 模块化脚本
RequireJS 是一个非常小巧的 JavaScript 模块载入框架,是 AMD 规范最好的实现者之一。最新版本的 RequireJS 压缩后只有 14K,堪称非常轻量。它还同时可以和其他的框架协同工作,使用 RequireJS 必将使的前端代码质量得以提升。
 
RequireJS 作为 JavaScript 文件的加载器,还是可以完成异步非阻塞的文件加载。
  1. define(['Controllers/Main/ListView'], function (ListView) {
  2. function start() {
  3. var users = JSON.parse(localStorage.users);
  4. ListView.render({ users: users });
  5. }
  6. return {
  7. start: start
  8. };
  9. });
 
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

SOA(面向服务的架构)的更多相关文章

  1. 使用WCF实现SOA面向服务编程—— 架构设计

    原文地址:http://www.cnblogs.com/leslies2/archive/2011/03/29/1997889.html SOA本身就是一种面向企业级服务的系统架构,简单来说,SOA就 ...

  2. SOA面向服务体系架构

    SOA概念 1.什么是SOA 面向服务的体系结构(Service-Oriented Architecture,SOA)是一个组件模型. 它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的 ...

  3. SOA面向服务的架构理解

    Ø  单一应用架构 ·当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本. Ø  垂直应用架构 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几 ...

  4. SOA面向服务的架构

    1.关于SOA的定义,目前主要有以下三个: 1)W3C的定义:SOA是一种应用程序架构,在这种架构中,所有功能都定义为独立的服务,这些服务带有定义明确的可调用接口,能够以定义好的顺序调用这些服务来形成 ...

  5. SOA面向服务架构

    SOA面向服务架构 风尘浪子 只要肯努力,梦想总有一天会实现 随笔分类 - SOA面向服务架构 结合领域驱动设计的SOA分布式软件架构 摘要: 领域驱动设计DDD的总体结构,Repository层使用 ...

  6. SOA (面向服务的架构)-Service Oriented Architecture

    SOA (面向服务的架构) 编辑 面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立 ...

  7. 聊聊SOA面向服务架构

    什么是SOA SOA(Service-Oriented Architecture),即面向服务的架构.SOA是一种粗粒度.松耦合服务架构,服务之间通过简单.精确定义接口进行通讯,不涉及底层编程接口和通 ...

  8. 亚马逊如何变成 SOA(面向服务的架构)?

    阮一峰 日期: 2016年9月10日 上一篇文章,我摘录了<程序员的呐喊>.这本书有趣的内容太多,今天再摘录一段. 1. 亚马逊公司不仅是世界最大的网络书店,还是世界最大的云服务商.它是怎 ...

  9. 面向服务体系架构(SOA)和数据仓库(DW)的思考基于 IBM 产品体系搭建基于 SOA 和 DW 的企业基础架构平台

    面向服务体系架构(SOA)和数据仓库(DW)的思考 基于 IBM 产品体系搭建基于 SOA 和 DW 的企业基础架构平台 当前业界对面向服务体系架构(SOA)和数据仓库(Data Warehouse, ...

  10. 面向服务的架构(SOA)

    SOA架构基础概念 面向服务的架构(SOA) 在深入探讨什么是面向服务的架构(SOA)之前,先建立一些基本的概念和术语的基本描述而非严格定义,所以也许有些定义在业内还存留争议,此处暂且忽略. 架构基础 ...

随机推荐

  1. Android自带样式

    Android系统自带样式: android:theme="@android:style/Theme.Dialog" 将一个Activity显示为对话框模式 android:the ...

  2. 多功能截图工具(WinSnap)4.5.6 绿色汉化版(附注册码)

    http://www.uzzf.com/Soft/9840.html 注册名:www.uzzf.com 注册码:FGE5ML-XD2C0G33-GCMDLRB5

  3. android使用XmlPullParser来解析XML文件

    解析下面的一个XML: <?xml version="1.0" encoding="utf-8" ?> <rss><sid> ...

  4. 【LeetCode】【Python解读】Container with most water

    这个问题是芭芭拉在采访中遇到的,不幸的是,的复杂性O(n2)该,太失望了,难怪没有通过面试. Given n non-negative integers a1, a2, ..., an, where ...

  5. hdu 4856 Tunnels(bfs+状态压缩)

    题目链接:hdu 4856 Tunnels 题目大意:给定一张图,图上有M个管道,管道给定入口和出口,单向,如今有人想要体验下这M个管道,问最短须要移动的距离,起点未定. 解题思路:首先用bfs处理出 ...

  6. Eamcs ditaa基于字符图形产生的图像上

    ditta和artist mode这是一个好兄弟.artist mode帮我创建一个字符模式速度,ditta是java计划,字符图形可被读取,并生成图像. ditta网站:http://ditaa.s ...

  7. 一天JavaScript示例-点击图片显示大图片添加鼠标

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. SplashScreenDemo

    对Java应用最常见的抱怨就是启动时间太长.这是因为Java虚拟机花费一段时间去加载所有必需的类,特别是对Swing应用,它们需要从Swing和AWT类库代码中去抽取大量的内容. 用户并不喜欢应用程序 ...

  9. Android开发之Handler的用法(源码分享)

    Handler主要接受子线程发送的数据, 并用此数据配合主线程更新UI.. 当应用程序启动时.Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发. ...

  10. Swift开发学习(两):Playground

    Swift开发学习:Playground 大约 对于软件用户.游戏玩家,我一直提倡用户体验.也是用户,是各种开发工具的使用者.也会喜欢用户体验做得好的工具软件.这次苹果想开发人员所想,提供了一个能够玩 ...