注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

WF4.0实战(十九):Silverlight+WCF+WF+Linq结合的一个示例  

2012-10-13 15:58:58|  分类: 工作流 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

概述: 

   这个Demo主要是为了阐述WF4中是如何使用WCF服务的,以及如何在Silverlight中调用WCF服务。因为即使用了Silverlight呈 现UI,又用Linq访问数据库。故本文的名字为:“Silverlight+WCF+WF+Linq结合的一个示例”。如果你和我一样,对WCF有点了 解,就知道WCF能将很多方法放在一Uri中供大家调用。那如何将多个WF流程放在一个Uri中供你调用呢?答案就是使用一个Pick活动,Pick活动 中可以有多个分支,对于Pick的每一个分支,你都可以设计一个流程,这种方式是非常有用的。好了,先看一下这个Demo实现了什么功能,在说如何实现, 最后总结,附代码下载。

效果:

     就是一个Silverlight的数据显示的界面,使用了northwnd数据库。左边显示所有的客户。右边上面是你选择顾客的订单。右边的下面是这个订单的详细情况。效果有点类似三级级联。

silverlight1

实现:

    这个Demo一共有四个项目,如下图:

silverlight2

项目说明:

    1、DataOperate:主要是linq生成的代码,用于数据库操作。

    2、MyFirstSilverlight:Silverlight项目,用于显示UI。

    3、MyFirstSilverlight.Web:asp.net项目,用于宿主Silverlight。

    4、WFService:把WF+WCF的项目,用于实现业务逻辑。

    我深信WCF+WF功能是十分强大的。本文只讲述一下WCF+WF结合的WFService是如何实现的。Silverlight和Linq的部分,详细见代码。

WFService实现:

    在Workflow模板下面,选择新建一个WCF Workflow Service,命名为WFService。

sl4

     在Service1.xamlx中删除原有的活动,拖放一个Pick活动,并添加三个分支,如下图。

sl5

    新建三个CodeActivity,分别命名为:GetCustomersActivity、GetOrderDetailsActivity、GetOrdersActivity。

    1、GetCustomersActivity:代码如下:

    public sealed class GetCustomersActivity : CodeActivity     {         public OutArgument<List<Customer>> CustomerList { get; set; }          protected override void Execute(CodeActivityContext context)         {             DataClasses1DataContext datacontext = new DataClasses1DataContext();             CustomerList.Set(context, datacontext.Customers.ToList());         }     }

    这个活动返回所有的顾客资料。

    2、GetOrdersActivity代码如下:

    public sealed class GetOrdersActivity : CodeActivity     {         public OutArgument<List<Order>> OrderList { get; set; }          public InArgument<string> customerID { get; set; }          protected override void Execute(CodeActivityContext context)         {             DataClasses1DataContext datacontext = new DataClasses1DataContext();             OrderList.Set(context,(from order in datacontext.Orders                     where order.CustomerID == customerID.Get(context)                     select order).ToList());         }     }

    这个活动返回顾客为customerID的所有订单。

    3、GetOrderDetailsActivity代码如下

    public sealed class GetOrderDetailsActivity : CodeActivity     {         public OutArgument<List<Order_Detail>> OrderDetailList { get; set; }         public InArgument<int> orderID { get; set; }          protected override void Execute(CodeActivityContext context)         {             DataClasses1DataContext datacontext = new DataClasses1DataContext();             OrderDetailList.Set( context,(from orderdetail in datacontext.Order_Details                     where orderdetail.OrderID == orderID.Get(context)                     select orderdetail).ToList());         }     }

    这个活动返回订单编号为orderID的订单详情。

    下面我们将这三个活动放在WF中流程中。

    在Pick的Trigger中拖三个Receive活动,设置如下图:

sl6

    由于具体使用Linq的访问数据库的实现还是在GetCustomersActivity、GetOrderDetailsActivity、GetOrdersActivity中,将这三个活动,拖入相应的Action中。

sl8 

    创建方法的返回值:右击Receive活动,选择Create SendReply。这是会提示你已经将SendReply复制到剪贴板中,你只需把它们粘贴到相对的地方。如下图:

ls9

    这样我们就定义好了这个WCF和WF的服务。

    在Silverlight项目中,选择添加服务引用,如下图:

sl9

    在MainPage.xaml.cs中添加下面引用代码:

using MyFirstSilverlight.ServiceReference;
   Silverlight中调用WCF服务,与普通程序调用WCF服务的不同,不是同步调用,而是异步调用,见下面代码:
        private void lstCustomers_Loaded(object sender, RoutedEventArgs e)         {             Service1Client svc = ServerManager.GetPox();             this.txtStatus.Text = "Loading customers...";             svc.GetCustomersCompleted += new               EventHandler<GetCustomersCompletedEventArgs>(svc_GetCustomersCompleted);             svc.GetCustomersAsync();         }          void svc_GetCustomersCompleted(object sender, GetCustomersCompletedEventArgs e)         {             if (e.Error == null)             {                 this.lstCustomers.ItemsSource = e.Result;                 this.txtStatus.Text = string.Empty;             }             else             {                 this.txtStatus.Text =                     "Error occured while loading customers from database";             }         }

    Demo很简单,其他项目的实现,详细见代码。

总结:

    这篇文章主要阐述了如何在WF中使用WCF服务。以及如何在Silverlight中调用WCF服务。

代码:

http://files.cnblogs.com/zhuqil/MyFirstSilverlight.rar

作者:朱祁林
出处:http://zhuqil.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  评论这张
 
阅读(627)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017