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

开发 架构
混合型框架为了支持WCF方式和传统访问数据库方式两种对数据操作的方式,有两个地方有扇出操作,一个是在界面上调用接口对象获取数据的时候有扇出操作,为了实现WCF方式和传统访问数据库方式的处理,如下所示

我在随笔《Winform开发框架之框架演化》和《Winform开发框架之混合型框架的实现》都对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文件里面,就清爽很多了,如下所示。

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

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

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

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

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

  1. /// <summary>  
  2. /// 根据字典类型获取对应的CListItem集合  
  3. /// </summary>  
  4. /// <param name="dictTypeName"></param>  
  5. /// <returns></returns>  
  6. public static CListItem[] GetDictByDictType(string dictTypeName)  
  7. {  
  8.     List<CListItem> itemList = new List<CListItem>();  
  9.     Dictionary<string, string> dict = WHC.Dictionary.UI.CallerFactory<WHC.Dictionary.Facade.IDictDataService>.Instance.GetDictByDictType(dictTypeName);  
  10.     foreach (string key in dict.Keys)  
  11.     {  
  12.         itemList.Add(new CListItem(key, dict[key]));  
  13.     }  
  14.     return itemList.ToArray();  

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

  1. private void winGridViewPager1_OnDeleteSelected(object sender, EventArgs e)  
  2. {  
  3.     if (MessageDxUtil.ShowYesNoAndTips("您确定删除选定的记录么?") == DialogResult.No)  
  4.     {  
  5.         return;  
  6.     }  
  7.  
  8.     int[] rowSelected = this.winGridViewPager1.GridView1.GetSelectedRows();  
  9.     foreach (int iRow in rowSelected)  
  10.     {  
  11.         string ID = this.winGridViewPager1.GridView1.GetRowCellDisplayText(iRow, "ID");  
  12.         CallerFactory<IItemDetailService>.Instance.Delete(ID);  
  13.     }  
  14.     BindData();  

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

  1. 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进行生成,然后在项目中整合即可。

原文链接:http://www.cnblogs.com/wuhuacong/archive/2013/04/22/3035736.html

责任编辑:张伟 来源: 博客园
相关推荐

2012-08-21 11:26:17

Winform

2012-01-09 15:01:30

TV

2023-09-07 08:00:00

2012-12-11 10:15:02

Winform开发框架

2012-11-20 10:04:46

Winform开发

2011-11-23 09:47:36

Winform

2010-06-22 11:00:26

虚拟化工作环境

2016-05-04 10:00:04

混合开发移动博客

2011-11-14 10:41:15

Winform数据管理模块Items

2022-09-22 12:04:22

.NET开发框架

2016-05-13 15:39:34

混合开发移动

2015-04-20 09:41:35

AWS混合型IT云供应商

2017-10-13 15:24:42

英特尔CPUFPGA

2010-01-07 15:22:46

2010-01-27 10:08:10

2016-03-23 11:05:58

Socket开发框架分析

2009-10-13 11:32:19

Winform假框架

2011-01-18 12:57:36

2009-09-29 10:00:40

Spring AOP框

2009-12-16 13:48:06

Ruby Web开发框
点赞
收藏

51CTO技术栈公众号