• Winform开发框架之混合型框架的剖析


    1、框架的扇出介绍

    混合型框架为了支持WCF方式和传统访问数据库方式两种对数据操作的方式,有两个地方有扇出操作,一个是在界面上调用接口对象获取数据的时候有扇出操作,为了实现WCF方式和传统访问数据库方式的处理,如下所示。当然,如果必要,也可以扩展成支持更多的类型,如可能存在旧系统的WebService调用方式等。

    另外,整个框架支持Oracle、SqlServer、MySql、Sqlite、Access等数据库的访问操作,因此在业务层调用具体数据访问类的时候,根据配置的不同,具体构造的数据库访问对象也不同,因此,这里也有一个扇出操作,而且扇出数量和支持的数据库一致,如下所示。

    2、混合型框架的辅助性模块集成

    混合型框架可以看成是Winform框架高级版本,除了它本身是一个完整的业务系统外,它外围的所有辅助性模块均(如通用权限、通用字典、通用附件管理、通用人员管理。。。。)都实现了这种混合型的框架,因此使用非常方便,整个框架如果简化来看,就是在原有的Winform界面层,用接口调用方式,避免和业务逻辑类的紧耦合关系。由于他是通过接口方式的调用方式,它本身又可以通过配置指定指向WCF的实现,因此也囊括了WCF框架的一切特点。

    3、混合型框架的项目及配置分离

    说到WCF的访问方式,混合型框架把业务系统的WCF服务和辅助性公用模块的WCF服务分开,首先是服务分开,然后是客户端配置文件分开。

    客户端配置文件分开,是通过把他们的服务配置信息分别用不同的文件表示,如辅助性模块的WCF配置文件为BaseWcfConfig.config,业务系统的WCF配置文件为WcfConfig.config,通过这样的分离设置,我们在主配置文件app.Config文件里面,就清爽很多了,如下所示。

    复制代码
      <appSettings>
        <!--软件名称-->
        <add key="ApplicationName" value="深田之星仓库管理系统"/>
        <!--开发商名称-->
        <add key="Manufacturer" value=""/>
        <!--组件的数据库类型:access、sqlserver、sqlite、oracle等,默认为sqlserver可不写-->
        <add key="ComponentDbType" value="sqlserver"/>
        <add key="AttachmentLicense" value="397cV0hDLlNlY3VybXR5fOS8jeWNjuiBqnzlua-lt57niLHlkK-o_6rmioDmnK-mnInpmZDlhbzlj7h8RmFsc2Uv" />
        
        <!--组件模块调用方式,采用WCF方式Value为wcf,采用Winform方式Value为win-->
        <add key="CallerType" value="wcf"/>
        <!--WCF服务的配置文件地址-->
        <add key="BaseWcfConfig" value="BaseWcfConfig.config"/>
        <add key="WcfConfig" value="WcfConfig.config"/>
      </appSettings>
    复制代码

    这样我们通过修改CallerType的内容(WCF或者WIN),就可以实现两种不同方式的访问了。

    整个项目工程的布局,除了刚才介绍的WCF服务模块,其实还有很多其他模块的,如下面图所示,包括业务逻辑模块,服务接口调用模块,Winform界面模块、WCF服务逻辑模块,整个系统的模块就包含这些,当然外围的辅助性模块,如字典、权限、人员等等,他们各自按照这个方式进行组织处理,系统调用的时候,不会具体关心它们的调用逻辑,因为它们的调用方式已经通过约定的CallerType的内容进行了指定。

    4、混合型框架的调用介绍

    对于混合型框架,不管它的数据调用逻辑是按照传统的Winform方式,还是分布式的WCF服务调用方式,实现代码都是一样的,因为它是基于接口层调用,如下所示是在框架系统中调用数据字典模块获取数据的代码实现。

    复制代码
            /// <summary>
            /// 根据字典类型获取对应的CListItem集合
            /// </summary>
            /// <param name="dictTypeName"></param>
            /// <returns></returns>
            public static CListItem[] GetDictByDictType(string dictTypeName)
            {
                List<CListItem> itemList = new List<CListItem>();
                Dictionary<string, string> dict = WHC.Dictionary.UI.CallerFactory<WHC.Dictionary.Facade.IDictDataService>.Instance.GetDictByDictType(dictTypeName);
                foreach (string key in dict.Keys)
                {
                    itemList.Add(new CListItem(key, dict[key]));
                }
                return itemList.ToArray();
            }
    复制代码

    系统框架调用自己的接口获取数据,模式也和上面一样,与传统的Winform框架调用代码相比,并没有增加任何工作流,只是调用对象有点变化而已。

    复制代码
            private void winGridViewPager1_OnDeleteSelected(object sender, EventArgs e)
            {
                if (MessageDxUtil.ShowYesNoAndTips("您确定删除选定的记录么?") == DialogResult.No)
                {
                    return;
                }
    
                int[] rowSelected = this.winGridViewPager1.GridView1.GetSelectedRows();
                foreach (int iRow in rowSelected)
                {
                    string ID = this.winGridViewPager1.GridView1.GetRowCellDisplayText(iRow, "ID");
                    CallerFactory<IItemDetailService>.Instance.Delete(ID);
                }
                BindData();
            }
    复制代码

    如果是传统的Winform框架,它的删除操作的核心调用代码是如下所示,是不是很相似的呢?

    BLLFactory<ItemDetail>.Instance.Delete(ID);

    5、混合式框架的代码生成工具支持

    当然,虽然混合型框架比传统的Winform框架和WCF开发框架更为通用,不过由于它引入了多一层,而且为了实现更多模块的分离,增加了一些设计上的复杂性,整个项目工程看起来显得复杂了一点,如下面就是一个以字典模块为例的混合型框架的内部结构。

    为了实现更简单化的开发,更快更高效的完成混合型框架的开发工作,我扩展了我的代码生成工具Database2Sharp,使其支持这种混合型框架的代码生成工作,这样开发混合型框架就和开发其他两种Winform开发框架、WCF开发框架一样,非常方便了。

    生成混合型框架项目的步骤就是在【EnterpriseLibrary代码生成】的最后一步进行勾选设置即可。

    代码生成工具,生成整体性的混合型框架项目如下所示,只是没有下图的界面部分,这部分在实际开发过程中,结合我的混合型框架案例进行整合即可,另外也可以界使用Database2Sharp进行Winform界面的开发,这样整体性就非常方便操作了:

    6、混合型框架的优化总结

    虽然整体性的混合型框架比其他两种框架模块,总体增加了一些难度及复杂性,不过,为了使得整个混合型框架开发和使用更加方便,我已经在设计上做了很多相关的工作,力求更好、更高效的使用好这种混合型框架,下面是我对整体性的框架做了的优化改进工作。

    1)把所有通用的模块开发好,方便更好的集成使用,更加高效利用通用模块,重复利用度更高;

    2)把WCF服务发布和服务逻辑分开,更好管理和发布WCF服务,服务发布只需要svc文件,不含任何后台代码;

    3)统一的业务调用规则和命名规则,所有模块的接口调用统一为CallerFactory<I***Service>方式,通用模块和框架的命名规则和机制完全一样。

    4)WCF服务配置文件分离,通用性的辅助模块的配置文件为BaseWcfConfig.config,业务系统的WCF配置文件为WcfConfig.config,配置文件分离更方便管理和维护,减少主配置文件app.Config的复杂性。

    5)最后一条,也是最重要的一条,就是代码生成工具Database2Sharp的同步支持。通过代码生成工具,更好、更快的生成整个混合性框架的代码和项目工程,一键解决所有的烦恼。Winform界面,利用代码生成工具Database2Sharp进行生成,然后在项目中整合即可。

  • 相关阅读:
    SetROP2
    FillRect与FrameRect用法
    MFC(继续画图,孙鑫C++第十讲笔记整理)
    海康威视DS-4100、4000HC 系列板卡SDK编程指南
    C--算法与数据结构--顺序表操作
    HTML 5--adding paragraphs
    HTML 5--基础
    temp--文件夹中的文件处理
    Java--蓝桥杯真题(二)
    Java--蓝桥杯真题
  • 原文地址:https://www.cnblogs.com/ruishuang208/p/3072622.html
Copyright © 2020-2023  润新知