一起谈.NET技术,WCF+WF双剑合璧构建微软的SOA系列(一):从一个简单的Demo开始-阿里云开发者社区

开发者社区> 狼人2007> 正文

一起谈.NET技术,WCF+WF双剑合璧构建微软的SOA系列(一):从一个简单的Demo开始

简介:   本系列文章将从实例出发,以实例结尾。由浅入深讲解在我们项目中如何使用WCF和WF。我们会发现使用WCF+WF将造就出其他技术无法达到的高度。最后我会将程序架到云端。   微软.net的3W(WPF、WCF、WF)战略如下图。
+关注继续查看

  本系列文章将从实例出发,以实例结尾。由浅入深讲解在我们项目中如何使用WCF和WF。我们会发现使用WCF+WF将造就出其他技术无法达到的高度。最后我会将程序架到云端。

  微软.net的3W(WPF、WCF、WF)战略如下图。WCF负责通信,WPF负责界面展示,WF负责处理业务逻辑,如下图。

untitled
  本系列文章会主要用到上图中的所有技术,但是主要讲述如何使用WCF和WF来实现系统的中间层。看过亮剑的朋友知道李云龙常打胜仗,并不是他懂得很多很多的战争的理论知识,而是来自实战中的经验。所以本系列的文章以实战为核心,在实战中出理论,不循规蹈矩,我将把自己的实力拿出来,亮出自己的宝剑。

  本系列文章除了WCF和WF两种主要的技术,还会用到很多其他的技术,WCF和WF两种技术将一用到底,也会牵扯到其它的技术如WPF、Asp.net MVC、Asp.net Web Form,NH、EF以及一些常用的技巧。我将在实战中进行演练和对比,在实战中发现最适合的技术。
  好了,牛皮吹完了,进入今天的正题。本文是这个系列的第一篇文章,我想了想还是从一个简单的Demo开始。通过这个实例来说明在项目中如何使用WCF和WF。WCF是如何进行数据传递的,WF是如何处理业务逻辑的。而实例的业务场景是非常常见的入库单:录入入库材料,更新库存数量。

  系统架构

  首先,我将说说这个系统架构。可以分为4层。
  第一层:数据持久层:这个例子中我用EF实现的。
  第二层:业务逻辑层:很明显,这一层我要使用WF实现。
  第三层:服务层:很明显,这一层我要使用WCF实现。
  第四层:界面层:这里我使用Asp.net MVC。后续文章中,我将会陆续使用MVC、WebForm、WPF、SL四种界面进行展示。
  架构图如下:

architecture

  数据库结构图:只有两种表。EnterStock表示入库记录表,Stock表示库存表。

db

  数据持久层设计:前面提到了,我使用了EF4实现数据库的访问。EF的基本使用大家可以到网上查阅,这里我主要讲一下值得讲解的东西。由于使用EF生成Model,那么如何在MVC中进行DataAnnotation验证。看下面代码设计就明白了。以库存表为例:

public partial class StockAutoMetadata
{

[DisplayName("Material ID")]
[Required]
public System.Guid MaterialID { get; set; }

[DisplayName("Material Name")]
[Required]
[StringLength(50)]
public string MaterialName { get; set; }

[DisplayName("Quantity")]
[Required]
public int Quantity { get; set; }
}
[MetadataType(typeof(StockAutoMetadata))]
public partial class Stock
{
}
//在partial类中注入元数据属性。

  业务逻辑层设计: 用WF处理业务逻辑层是本系列文章的重点。我以入库操作为例。

  1、增加材料的功能函数设计

public sealed class InsertEnterStock : CodeActivity
{
public InArgument<EnterStock> Stock { get; set; }

protected override void Execute(CodeActivityContext context)
{
InvoicingEntities entity = new InvoicingEntities();
entity.AddToEnterStock(Stock.Get(context));
entity.SaveChanges();
}
}

  2、更新库存的功能函数设计

public sealed class UpdateStock : CodeActivity
{
public InArgument<EnterStock> EnterStock { get; set; }

protected override void Execute(CodeActivityContext context)
{
InvoicingEntities entity = new InvoicingEntities();
var res = (from r in entity.Stock.ToList() where r.MaterialID == EnterStock.Get(context).MaterialNO select r).FirstOrDefault();
res.Quantity = res.Quantity + EnterStock.Get(context).Quantity;
entity.ApplyCurrentValues(res.EntityKey.EntitySetName, res);
entity.SaveChanges();
}
}

  3、入库操作的业务函数设计

  分析:这里我将业务逻辑处理分成了两种形式。

  1、功能函数:任务单一、简单;以代码的方式展现。

  2、业务函数:业务复杂,有功能函数组合而成;以图形化的方式展现。

  这样设计,我业务逻辑处理就非常清晰了。

  服务层设计:在WCF中我要做的只是启动这些业务流程。

  契约:

[ServiceContract]
public interface IInvoicingService
{

[OperationContract]
string EnterStock(EnterStock stock);

[OperationContract]
IEnumerable<Stock> GetStockList();

[OperationContract]
IEnumerable<EnterStock> GetEnterStockList();

}

  实现:

public class InvoicingService : IInvoicingService
{

public string EnterStock(EnterStock stock)
{
var p = new Dictionary<string, object> ();
p.Add("argEnterStock", stock);
WorkflowInvoker.Invoke(new EnterStockBusiness(), p);
return "ok";

}


public IEnumerable<Stock> GetStockList()
{
IDictionary<string, object> outArgument = WorkflowInvoker.Invoke(new GetStockList());
return outArgument["StockList"] as List<Stock>;
}


public IEnumerable<EnterStock> GetEnterStockList()
{
IDictionary<string, object> outArgument = WorkflowInvoker.Invoke(new GetEnterStockList());
return outArgument["EnterStockList"] as List<EnterStock>;
}
}

  在服务层中,我没有任何的业务逻辑判断和处理,我完全封装到业务逻辑层了。

  界面层:界面层你可以使用如何你熟悉的技术去实现。这里我使用了Asp.net MVC。具体的实现我不细说了,就让我演示一下这个简单的Demo。

  1、简单的主页

1

  2、 库存中两种材料的库存数量都是:

2

  3、添加材料

3

  4、库存数量被更新

4

  5、入库记录列表

5

  总结:本文是WCF+WF双剑合璧系列的第一篇文章,带领大家实现了一个简单的Demo。这个Demo还是原型,存在很多不足。希望大家能提出你宝贵的建议,帮助我写好这个系列的文章。下篇文章中将会谈谈系统如何实现错误处理机制。

  代码:http://files.cnblogs.com/zhuqil/Invoicing.rar

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
通过Flink实时构建搜索引擎的索引
1.背景介绍 搜索引擎的出现大大降低了人们寻找信息的难度,已经深入到生活与工作的方方面面,简单列举几个应用如下: 互联网搜索,如谷歌,百度等; 垂直搜索,如淘宝、天猫的商品搜索; 站内搜索,各个内容网站提供的站内搜索服务; 企业内部搜索,员工查询企业内部信息; 广告投放,根据投放上下文检索出对应的广告主和广告内容; 搜索引擎的关键是让用户找到其所需信息,其整体架构如下: 从图示可知,一个搜索引擎从大的方面来看主要包括两部分,一部分是提供在线的搜索服务,一部分要把原始数据已离线的方式建立索引,建立索引是信息可搜索的前提。
14536 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2837 0
重磅首发|如何构建Flutter企业级应用开发?闲鱼技术实战白皮书帮我解答
《Flutter企业级应用开发实战手册》重磅升级!本书由浅入深、娓娓道来地讲述 Flutter 核心知识点,更囊括进阶与深度内容。全书结合知识点,配以相关案例与实践进行讲解,通过思路引导,举一反三。
2317 0
《SOA与REST:用REST构建企业级SOA解决方案》目录—导读
本书的作者们对于什么是REST,什么不是REST具有非常清晰的理解,所以,本书给你带来的知识,可以帮助你区分哪些是真正的RESTful,哪些又只是自我标榜。你将学习SOA与REST的基础知识,还会了解若干结合了SOA与REST的设计模式。你还会学到如何构建服务及服务消费者。
3009 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10462 0
《Android游戏开发详解》一2.7 构建一个简单的计数程序
在下一个示例中,我们将利用第1章中介绍过的for循环来打印出数字5到12之间的每一个偶数。这是一个简单的游戏示例,但是,掌握for循环语法的技巧很重要。
1129 0
+关注
狼人2007
个人对技术的追求:代码少而精捍;思路清晰美观;可扩展好维护;技术驱动商业; 人生格言:只要你有信念,有追求,并且坚持,那你一定比随波逐流,行得远行得正...
3528
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载