热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SOA(面向服务的架构)HackerVirus

前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVCWebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理,是本文论述的重点。此外,插件技术
SOA(面向服务的架构)

前言: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语法十分简单。并且无须迁就数据库的设计。

 

 

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

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

4.4 判断对象是否为NULL(c#)
[csharp] view plaincopy
 
  1. // C# 例子. 不要在Javascript中这样写  
  2. if ( someString != null &&  
  3.     someString.length > 0 ) {  
  4.     //Do something here...  
  5. }  
  6.   
  7. // C# 例子 检查字符串是否为空  
  8. if ( !string.IsNullOrEmpty(someString) ) {  
  9.     //Do something here...  
  10. }  

4.5 判断对象是否为NULL(Javascript)
[Javascript] view plaincopy
 
  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#)
 
[csharp] view plaincopy
 
  1. "color: rgb(255, 0, 0);">// C# 例子,不要在Javascript这样写  
  2. if ( someString == null ) {  
  3.    someString = "default Value";  
  4. }  
  5. // Slightly better, but don\'t do this either  
  6. someString = someString ? someString : "default value"; "code" class="Javascript">请在Javascript按如下格式写  
  7. // Javascript syntax to set a default value  
  8. someString = someString || "default value";  

  9.   
  10.   
  11.   
  12.   
  13.   
  14.   
  15.   
  16.   
  17.   
  18.   
  19.   
  20.   
 
 
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
 
  1. var myArray = [], name;  
  2. myArray[5] = "test";  
  3. console.log( myArray.length ); //6  
  4.    
  5. for ( name in myArray ) {  
  6.     console.log( name, myArray[name] );  
  7.     //Outputs...  
  8.     //   5, test  
  9. }  

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

推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
author-avatar
LMS柳树_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有