zoukankan      html  css  js  c++  java
  • WCF开发框架之插件化应用模式升级

    自从在《Winform开发框架之插件化应用框架实现》一文中,介绍并总结了Winform开发框架插件化应用框架的实现后,赢得了很多同行和客户的支持,于是把我的WCF开发框架、混合式开发框架都进行了升级,把它们都提升到插件化应用的高度上。本文主要介绍WCF开发框架,如何实现插件化的应用。从我随笔《基于我的Winform开发框架扩展而成的WCF开发框架》介绍可以看到,一般的WCF应用,是在客户端添加服务应用的方式,然后使用自动生成的WCF服务客户端代理来访问相应的服务的,这种方式比较方便快捷,但是也增加了客户端界面和WCF服务的耦合性,架构布局如下所示。

     

    为了更好有效利用松耦合的特点,以及插件化应用的特点,我对整个WCF开发框架进行了一个大的调整,以便更好整合及利用好的特点。如下图所示,插件化应用框架的启动模块,它除了依赖基础服务模块中(包括权限管理模块和字典模块),其他的模块如WCF服务模块、主业务插件模块A(主业务模块B)等都是通过配置方式实现对接的,他们之间没有明显的耦合关系。

       

    整个项目工程的布局如下所示,其中BaseUIDx为基础界面类,方便各个插件模块重用而分离出来的。其他模块的功能如上图所示。

    主业务插件模块是指各种各种的插件化业务模块,他们本身包含有界面部分、WCF服务调用、以及业务逻辑等内容。

     

    为了更好分离WCF服务的部署和WCF服务逻辑(这也是最佳实践),实现更好的代码控制和重用,WCF项目的架构关系设置成如下所示。

    其中WHC.WareHouseMis.WCFLibrary是整个WCF服务的业务逻辑模块,它囊括了统一调用接口Facade层、WCF业务实现WCFLibrary层、BLL业务层、数据接口IDAL层、数据访问实现DAL层、实体类Entity层。

    当然,以上的关系不需要手工来做这些繁琐的代码对应关系,只需要设计好表后,使用代码生成工具Database2Sharp一键生成就可以了,其中很多项目关系已经生成好了,增量开发的时候,重新引用下文件关系即可。

    而且整个WCF不在使用在界面层直接引用WCF服务的方式,而采用了自定义的客户端信道(允许从自定义的配置文件中加载)方式实现对应WCF服务客户端代理类的创建。

    以WCF的调用类ItemDetailCaller为例,使用代码生成工具生成的代码,它已经继承了某个接口IItemDetailService服务基类了,并给它指定了具体的WCF服务节点即可,如下代码所示。

        public class ItemDetailCaller : BaseService<ItemDetailInfo>, IItemDetailService
        {
            public ItemDetailCaller()  : base()
            {
                this.endpointConfigurationName = EndPointConfig.ItemDetailService;
            }

    实现接口IItemDetailService的函数很有规律,使用下面类似的代码即可。

            public List<ItemDetailInfo> FindByBigType(string bigType)
            {
                List<ItemDetailInfo> result = new List<ItemDetailInfo>();
    
                IItemDetailService service = CreateSubClient();
                ICommunicationObject comm = service as ICommunicationObject;
                comm.Using(client =>
                {
                    result = service.FindByBigType(bigType);
                });
    
                return result;
            }

    这样进行了包装后,我们使用WCF服务就好像之前的Winform开发框架使用BLLFactory的方式一样了,WCF服务调用示例代码如下所示。

                        bool succeed = CallerFactory<IItemDetailService>.Instance.Update(info, info.ID.ToString());
                        if (succeed)
                        {
                            try
                            {
                                StockInfo stockInfo = CallerFactory<IStockService>.Instance.FindByItemNo2(this.txtItemNo.Text, this.txtBelongWareHouse.Tag.ToString());
                                if (stockInfo != null)
                                {
                                    stockInfo.WareHouse = txtBelongWareHouse.Text;
                                    CallerFactory<IStockService>.Instance.Update(stockInfo, stockInfo.ID.ToString());
                                }
    
                                //不管是更新还是新增,如果对应的备件编码在库房没有初始化,初始化之
                                bool isInit = CallerFactory<IStockService>.Instance.CheckIsInitedWareHouse(this.txtBelongWareHouse.Text, this.txtItemNo.Text);
                                if (!isInit)
                                {
                                    CallerFactory<IStockService>.Instance.InitStockQuantity(info, 0, this.txtBelongWareHouse.Text);
                                }
                            }
                            catch (Exception ex)
                            {
                                MessageDxUtil.ShowTips(string.Format("初始化库存为0失败:", ex.Message));
                            }
    
                            return true;
                        }
  • 相关阅读:
    POJ 1466 Girls and Boys 黑白染色 + 二分匹配 (最大独立集) 好题
    POJ2226 Muddy Fields 二分匹配 最小顶点覆盖 好题
    POJ 2195 Going Home 最小费用流 裸题
    POJ 3368 Frequent values RMQ 训练指南 好题
    POJ 3187 杨辉三角+枚举排列 好题
    POJ 2393 贪心 简单题
    系统监控
    系统的初始化和服务
    vi与vim
    正文处理命令及tar命令
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/3228365.html
Copyright © 2011-2022 走看看