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


         本系列文章将从实例出发,以实例结尾。由浅入深讲解在我们项目中如何使用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、入库操作的业务函数设计
    rk 
    分析:这里我将业务逻辑处理分成了两种形式。
    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、 库存中两种材料的库存数量都是0

    2

       3、添加材料

    3

    4、库存数量被更新

    4

    5、入库记录列表

    5

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

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



    (全文完)


    以下为广告部分

    您部署的HTTPS网站安全吗?

    如果您想看下您的网站HTTPS部署的是否安全,花1分钟时间来 myssl.com 检测以下吧。让您的HTTPS网站变得更安全!

    SSL检测评估

    快速了解HTTPS网站安全情况。

    安全评级(A+、A、A-...)、行业合规检测、证书信息查看、证书链信息以及补完、服务器套件信息、证书兼容性检测等。

    SSL证书工具

    安装部署SSL证书变得更方便。

    SSL证书内容查看、SSL证书格式转换、CSR在线生成、SSL私钥加解密、CAA检测等。

    SSL漏洞检测

    让服务器远离SSL证书漏洞侵扰

    TLS ROBOT漏洞检测、心血漏洞检测、FREAK Attack漏洞检测、SSL Poodle漏洞检测、CCS注入漏洞检测。

    作者:朱祁林 出处:http://zhuqil.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。  
  • 相关阅读:
    jdk8u144安装在centos7上
    事件对象(示例、封装函数EventUtil())
    事件处理程序
    取消冒泡
    编程挑战JavaScript进阶篇(慕课网题目)
    网页卷去的距离与偏移量
    DOM编程练习(慕课网题目)
    浏览器窗口可视区域大小
    网页尺寸scrollHeight/offsetHeight
    替换元素节点replaceChild()
  • 原文地址:https://www.cnblogs.com/zhuqil/p/1865870.html
Copyright © 2020-2023  润新知