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

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

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


  本系列文章会主要用到上图中的所有技术,但是主要讲述如何使用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四种界面进行展示。
  架构图如下:

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

  数据持久层设计:前面提到了,我使用了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、简单的主页

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

  3、添加材料

  4、库存数量被更新

  5、入库记录列表

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

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

时间: 2025-01-27 18:44:32

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

WCF+WF双剑合璧构建微软的SOA系列(一):从一个简单的Demo开始

本系列文章将从实例出发,以实例结尾.由浅入深讲解在我们项目中如何使用WCF和WF.我们会发现使用WCF+WF将造就出其他技术无法达到的高度.最后我会将程序架到云端. 微软.net的3W(WPF.WCF.WF)战略如下图.WCF负责通信,WPF负责界面展示,WF负责处理业务逻辑,如下图. 本系列文章会主要用到上图中的所有技术,但是主要讲述如何使用WCF和WF来实现系统的中间层.看过亮剑的朋友知道李云龙常打胜仗,并不是他懂得很多很多的战争的理论知识,而是来自实战中的经验.所以本系列的文章以实战为核心

一起谈.NET技术,抛砖引玉:我看微软.NET各子技术领域之应用前景

从2002年发布.NET 1.0,历经8年发展,.NET发展到了4.0,已经成为一个庞大而复杂的软件开发与运行平台,其架构日益复杂,其应用领域也在不断地扩展,包容了"一堆"的子技术领域.在.NET 4.0即将发布之际,回顾一下已发布的各项.NET技术,看看哪些技术用得很火,哪些被打入冷宫,再猜猜.NET 4.0中可能会有哪些技术会得到"青睐",是件有意思的事. 1. 桌面应用程序开发技术( Windows Form和WPF) 在.NET桌面应用程序开发领域,Wind

一起谈.NET技术,.NET 4 并行(多核)编程系列之二 从Task开始

前言:我们一步步的从简单的开始讲述,还是沿用我一直的方式:慢慢演化,步步为营. 本篇文章的议题如下: 1.Task基础介绍 2.Task的创建 3.获取Task的执行结果 4. 补充细节 1.Task基础介绍 首先我们还是来看看一段简单的代码: 这里展示的只是一段简单的代码,不能显示出并行编程的特点.但是我们还是从最基本的开始看,慢慢进入深一点的话题. 如果你曾经用过.NET 中的多线程编程,比较一下,就会发现:这段代码虽然在底层还是使用了多线程,但是写法上却简化了很多,一行代码就实现了一个并行

一起谈.NET技术,梦想创造可能——盘点微软 .NET 技术八年发展历程

文 / 刘如鸿 2000年对于微软是颇有意思的一年,一方面终于迈入了21世纪,担心许久的千年虫问题也没有预想中的那样大面积爆发,通过Windows 95和Windows 98的成功,微软在桌面电脑市场取得了绝对垄断的地位.虽然官司不断,但通过IE捆绑策略也终于彻底打败了傲慢的Netscape,搭上了互联网班车.而Windows 2000的发布也结束了Windows 98和Windows NT两个平台互不兼容.互相掐架的问题,在全新的NT 5.0内核上,服务器和客户端操作系统终于得到了整合.至于办

一起谈.NET技术,.NET 4 并行(多核)编程系列之一入门介绍

本系列文章将会对.NET 4中的并行编程技术(也称之为多核编程技术)以及应用作全面的介绍. 本篇文章的议题如下: 1. 并行编程和多线程编程的区别. 2. 并行编程技术的利弊 3. 何时采用并行编程 1.并行编程和多线程编程的区别. 1.1并行编程. 现在随着多核计算机的普及,并行编程技术,也就是多核编程技术也逐渐称为开发的主流.为此,在.NET 4 中就引入了"并行编程".在.NET 4 中一些列的Library和类为并行编程提供了支持,如: Task Parallel Librar

一起谈.NET技术,LightSwitch:小试一下微软开发框架LightSwitch

之前知道微软在做一个数据驱动的开发框架LightSwitch,但没有用过.前一阵子,一个客户的技术负责人和我说起LightSwitch,所以这次TechNet也就去听了一下LightSwitch的讲座.回来后试用了一下,下面给大家简单介绍一下LigthSwitch. 安装 从官方网站下载,我机器本身装了VS2010,安装过程中会去下载一些文件,大概80M吧. 执行安装过程中我出现了一个问题,不知道你有没有.我的问题如下图,从提示看出是权限不够,所以我找到这个隐藏目录在[安全]页增加了Everyo

一起谈.NET技术,Visual Studio 2010构建Web浏览器应用程序

2001年,我使用C#中的WebBrowser ActiveX控件编写了我的第一个应用程序,点此阅读,Kapil Sony写了一篇文章介绍了C# 2.0中的WebBrowser控件,每一次.NET新版本发布,控件和功能都会发生一些变化,现在,WebBrowser控件已属于Windows Forms控件的一部分,本文是基于.NET 4.0和Visual Studio 2010完成的,如果你使用的不是Visual Studio 2010,可以去MSDN网站下载免费的Visual C# 2010 Ex

一起谈.NET技术,Silverlight同步(Synchronous)调用WCF服务

Silverlight的RIA应用中访问远端的WebService或WCF服务,都是通过异步线程模式调用的.在某些情况下我们的调用是需要同步进行,虽然Silverlight没有内置同步线程模式调用远端服务接口,但是我们可以通过多线程的处理来伪装出同步调用的实现.在.NET Framework的多线程编程中提供了丰富的线程接口,其中AutoResetEvent和ManualResetEvent在多线程编码中最为常用,本文将介绍如何通过AutoResetEvent的线程等待特性实现Silverlig

一起谈.NET技术,使用WCF实现SOA面向服务编程——简单的WCF开发实例

前面为大家介绍过WCF的特点,现在再讲解一下WCF基础概念. 在WCF里,各个Application之间的通信是由EndPoint来实现的,EndPoint是WCF实现通信的核心要素.一个WCF Service可由多个EndPoint集合组成,每个EndPoint只能有一种绑定,就是说EndPoint就是通信的入口,客户端和服务端通过 EndPoint交换信息. <service name = " " >< endpoint address = ""