• WF & WCF(4)


    概述: 

       这个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服务。

    代码:

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

  • 相关阅读:
    在Linux下OpenCV的下载和编译
    安装GDB-ImageWatch ,在QT中查看图像
    linux下对qt编写的程序进行部署
    GOQTTemplate简单介绍
    寻找激光的交叉点
    基于opencv和QT的摄像头采集代码( GoQTtemplate3持续更新)
    图像处理工程师的要求研究
    如何将QT的pro图标修改的更显著一些
    快速阅读《QT5.9 c++开发指南》2
    小米盒子连接老式电脑显示器(VGA接口)
  • 原文地址:https://www.cnblogs.com/Mayvar/p/wanghonghua_201108131124.html
Copyright © 2020-2023  润新知