• WF 工作流(6)


    在这一章,你将添加逻辑去验证订单项是否有存货。为了去完成它,你需要重复用同样的方式验证每一个订单项,如果有一项没有存货,你将抛出一个异常,这个异常可以被你的工作流捕获。

    重新利用Chapter5项目

    打开Visual Studio 2010 创建一个新的项目,选择Blank Solution模板,如图Figure6-1所示。输入解决方案名为Chapter06

    复制Chapter05目录下的OrderProcess文件夹到Chapter06的目录下。在Solution Explorer中,右击Chapter06解决方案,选择Add>Existing ProjectAdd Existing Project对话框会出现。选择Chapter06\OrderProcess下的OrderProcess.csproj文件。(这跟上一章的做法是一样的。)

    添加检验存货活动

    现在你将要添加逻辑去验证是否有充足的存货给订单了。

    TryCatch活动

    打开OrderWF.xaml文件的设计视图。拖拉一个TryCatch活动到“Handling Charges”活动的下面。修改DisplayNameCheck Stock,点击活动右上角的展开按钮。设计视图如图Figure6-2所示。

    TryCatch活动有三个节点。在Try节点中,你可以放置一系列可能产生异常的活动。在Catches节点中,你可以定义一个或多个Catch对象。每一Catch对象处理一个特定的异常。Finally节点是可选的。你可以放置一系列活动到这里,这里的活动是在Try活动(和任何被异常引发的Catch对象)执行完之后执行的。

    定义一个异常

    你将定义一个异常,这个异常是当没有存货时抛出的。打开Order.cs文件,添加下面的代码去定义OutOfStockException类。

        //----------------------------------------

        //define the exception to be thrown if an item

        //is out of stock

        //----------------------------------------

        public class OutOfStockException : Exception

        {

            public OutOfStockException()

                : base()

            { }

     

            public OutOfStockException(string message)

                : base(message)

            { }

        }

    这应该添加在Order类定义之后,在OrderProcess命名空间中。完整的Order.cs如下所示:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

     

    namespace OrderProcess

    {

        public class OrderItem

        {

            public int OrderItemID { get; set; }

            public int Quantity { get; set; }

            public string ItemCode { get; set; }

            public string Description { get; set; }

        }

     

        public class Order

        {

            public Order()

            {

                Items = new List<OrderItem>();

            }

     

            public int OrderID { get; set; }

            public string Description { get; set; }

            public decimal TotalWeight { get; set; }

            public string ShippingMethod { get; set; }

     

            public List<OrderItem> Items { get; set; }

        }

     

        //----------------------------------------

        //define the exception to be thrown if an item

        //is out of stock

        //----------------------------------------

        public class OutOfStockException : Exception

        {

            public OutOfStockException()

                : base()

            { }

     

            public OutOfStockException(string message)

                : base(message)

            { }

        }

    }

    ForEach活动

    拖放一个ForEach活动到Try节点中,设置DisplayNameCheck Each Item。点击展开按钮,在Expression中输入以下代码:

    OrderInfo.Items

    这定义了循环访问订单项中的每一项。(ForEach活动的详细信息请参考第五章。)在属性窗口中,对于TypeArgument属性,选在Browse for Types,然后选择OrderProcess引用下的OrderItem类。(跟第五章一样)。

    If活动

    拖拉一个If活动到Body节点,展开活动,设置DisplayNameIf Out of Stock。如图Figure6-3所示。

    Condition属性中输入下面代码:

    Item.ItemCode = “12346”

    提示:在真正的程序开发中,你会从数据库中取出数据,然后验证这些数据是否没有存货。在这个示例中,判断是否没有存货是硬编码的。

    Throw活动

    拖放一个Throw活动到Then节点。在属性窗口,它只有两个属性:DisplayNameException。对于Exception属性,输入下面代码:

    New OrderProcess.OutOfStockException”Item Code: ” + item.ItemCode

    这创建了一个OutOfStockException对象,指定了是哪个订单项是没有存货的信息。“If Out of Stock”活动应该如图Figure6-4所示。

    Catch活动

    Check Stock”活动应该如图Figure6-5所示。

    点击Add new catch链接。将会出现一个下拉列表,选择Browse for Types,选择OrderProcess引用下的OutOfStockException,如图Figure6-6所示。

    图形应该如图Figure6-7所示。

    你将会捕获循环的异常,你应该定义可以执行处理这个异常的活动。对于这个项目,你将输出一行信息去指出是哪一项是没有存货的。拖放一个WriteLine活动到Catches节点中,Text属性为:

     

    “Item is out of stock - ” + exception.Message

    这行代码从异常中获取信息,信息包含了没有存货的订单项号。收缩“Check Stock”活动然后展开它。“Check Stock”的最终如图Figure6-8所示。

    运行程序

    点击F5,结果如下所示:

    异常

    选择在哪里摆放异常处理时非常重要的。例如你可以把整个工作流摆放到一个TryCatch活动的Try节点中,虽然这是一个简单的方式去捕获所有的异常。但是,这可能没有让你真正的去处理这些异常。让我解析一下。

  • 相关阅读:
    交换机主要参数详解
    Linksys E 刷Tomato shibby
    802.11n 连接的建议设置是什么?
    Wi-Fi 协议和数率?
    windows xp 不支持Wap2加密方式
    电脑稳定性检测软件
    看懂影片标题,各种电影视频格式标题的含义
    【生活】生活点滴记录
    【自动化测试】关于UI自动化的疑问(记录ing)
    【学习】代码的编码规范
  • 原文地址:https://www.cnblogs.com/Mayvar/p/wanghonghua_201108020853.html
Copyright © 2020-2023  润新知