• 四、利用EnterpriseFrameWork快速开发基于WCF为中间件的三层结构系统


    回《【开源】EnterpriseFrameWork框架系列文章索引

    EnterpriseFrameWork框架实例源代码下载: 实例下载

          本章内容与上一张《利用EnterpriseFrameWork快速开发Winform系统(C/S》关系紧密,WCF模式只是在Winform模式中的界面层和逻辑层之间加入了WCF中间件用来实现双方的通讯,说得更简单一点就是把Winform模式中的winController控制器给拆分为wcfControllerwcfclientControlle两个控制器并用WCF实现两个控制器之间的通讯,双方数据传递与Web模式一样用Json数据格式;

          还有一点就是我们一定要明白WCF模式并不是说把所有业务都封装成wcf服务提供给界面层调用,wcfControllerwebController一样只是单纯的业务控制器,而wcf服务在框架中也只有一个就是在WCFHosting服务主机中WCFHandlerService,用来实现通讯的

     

    本文要点:

    1.WCF版界面效果

    2.WCF项目开发步骤

    3.代码文件调用关系图

    4.常见问题汇总

     

          1.同样是用书籍的管理作实例,实现对书籍的增、删、改、查功能,我们先看界面效果

          如下,请注意红色框部分,点击界面的保存按钮后,第二张图的WCF主机就会接收到保存书籍的命令并执行,红色框为执行过程;(其中WCF主机会再后续章节详细说明)

           

          

     

          解决方案目录,其中红色文件为本章实例新增的文件

           

          2.开发步骤:

          1)新增WCF控制器,如上(bookWcfController.cs)

          2)新增WCFCient界面控制器,如上(bookwcfclientController.cs)

          其中实体(Book.cs)、Dao(BookDao.cs)和界面(frmBookManager.cs)在上一章实例中已经完成,所以本章直接调用就行了,加上本章新增的bookWcfController.cs和bookwcfclientController.cs就可以让WCF模式实例运行起来;

     

    bookWcfController.cs文件

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using EFWCoreLib.WCFHandler;
    using Books.Entity;
    using Books.Dao;
    using System.Data;
    
    namespace Books.WcfController
    {
        [WCFController]
        public class bookWcfController : JsonWCFController
        {
            [WCFMethod]
            public string SaveBook()
            {
                var data= ToObject(ParamJsonData);
                Book book = ToObject<Book>(ToArray(data)[0]);
                book.BindDb(oleDb, _container);//反序列化的对象,必须绑定数据库操作对象
                book.save();
                return "true";
            }
            [WCFMethod]
            public string GetBooks()
            {
                BookDao bdao = NewDao<BookDao>();
                DataTable dt = bdao.GetBooks("", 0);
                return base.ToJson(dt);
            }
        }
    }
    View Code

          bookWcfController对象的功能方法其实与第二章中Web模式的bookController控制器。

          一样的,只是接收参数数据与返回json数据的方式一点点的区别而已;再就是bookWcfController对象必须继承框架中的JsonWCFController对象,还有配置类的自定义标签[WCFController]和方法的标签[WCFMethod],用来区别其他模式的控制器。

     

    bookwcfclientController.cs文件

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using EFWCoreLib.WCFHandler;
    using Books.WinController.Iviewform;
    using System.Data;
    using Books.Entity;
    
    namespace Books.Winform.WcfAction
    {
        [EFWCoreLib.WinformFrame.Controller.Menu]//与系统菜单对应
        [EFWCoreLib.WinformFrame.Controller.View(DllName = "Books.Winform.dll", ViewTypeName = "Books.Winform.Viewform.frmBookManager", DefaultView = true)]
        public class bookwcfclientController : BaseWCFClientController
        {
            IfrmBook frmBook;
            public override void Init()
            {
                frmBook = (IfrmBook)DefaultView;
                //初始化加载书籍目录
                GetBooks();
            }
    
            //获取书籍目录
            public void GetBooks()
            {
                //通过wcf服务调用bookWcfController控制器中的GetBooks方法
                Object retdata = InvokeWCFService("bookWcfController", "GetBooks");
                DataTable dt = ToDataTable(retdata);
                frmBook.loadbooks(dt);
            }
    
            //保存
            public void bookSave()
            {
                //通过wcf服务调用bookWcfController控制器中的SaveBook方法,并传递参数Book对象
                InvokeWCFService("bookWcfController", "SaveBook",frmBook.currBook);
                GetBooks();
            }
        }
    }
    View Code

     

          bookwcfclientController对象必须继承BaseWCFClientController对象,且它是与界面层在同一项目中,其他的配置如控制器对应的界面,对应的菜单都与Winform模式winController1控制器一样,也依赖于IfrmBook接口;其实bookwcfclientController具有的功能与Winform的控制器一样,只去掉了操作逻辑层的功能与增加了访问wcfController控制器的功能。

     

          讲到这里不知道大家有没有发现一点,就是从第二章的Web模式,第三章的Winform模式到本章WCF模式,项目的代码文件都是共同使用的,比如第一章web模式中的实体和Dao,第二种Winform模式的界面文件和接口文件都是可以直接使用,并不需要任何一点点的改动,特别是Wcf模式完全可以兼容Winform模式的界面代码;这就是EnterpriseFrameWork框架的特别之处,完全整合了这些模式在框架中;这样在项目中我们可以根据具体情况可以很方便的调整开发模式,降低我们的开发成本。

     

          再讲一下WCF模式的由来,Winform模式是一种非常简单的开发模式,目前大部分应用软件项目基本上都是这样做的,部署简单,服务器装上数据库,程序安装在客户机上。不管开发还是实施都是直接干脆之极,让中小企业在成本与人才各方面考虑都是用的最多的模式。虽然Winform模式简单,但同样也有问题,首先在安全上直接暴露了服务器与数据库操作,再就是不太适合复杂的网络环境,维护升级都极为不方便等。所以随着项目的规模越来越大,一些系统架构上的调整也是必要的。

          EnterpriseFrameWork框架中加入WCF开发模式就是基于这些方面的实际需求,所以怎样才能最小代价的扩展成WCF模式,就是一直困扰我的问题,难道要把原有系统中的所有业务都重写封装成wcf服务?重写的代价真的有点大,特别让我接受不了的完全与框架的核心“简洁”冲突了。也参考过其他公司的wcf框架,也是觉得可能把业务封装成wcf服务太麻烦,所以干脆就是对数据库的操作也就是DbHelper对象给用wcf服务封装了,用wcf服务的方式操作数据库,我就傻眼了。直到今年才找到如今这种方式,把Winform模式的控制器给拆分为wcfControllerwcfclientController,两个控制器之间用wcf服务通讯。

          这也是一次让我非常得意的改进,不知道大家用wcf做项目是一种什么样的开发模式?

     

          3.最后我们看下图,整理一下以上代码文件的调用关系

          

     

    EnterpriseFrameWork框架实例源代码下载: 实例下载

     

    回《【开源】EnterpriseFrameWork框架系列文章索引

  • 相关阅读:
    畅通工程续 dijkstra
    能量项链 区间dp
    机器人军团
    skiing
    数论知识
    灯泡游戏
    60. 第k个排列
    17. 电话号码的字母组合
    101. 对称二叉树
    144. 二叉树的前序遍历
  • 原文地址:https://www.cnblogs.com/kakake/p/3945878.html
Copyright © 2020-2023  润新知