95992828九五至尊2

882828九五至尊手机版稳中求进开发WinForm项目,Winform开发框架之混合型框架的兑现

二月 15th, 2019  |  882828九五至尊手机版

自身在事先一篇文章《Winform开发框架之框架衍变》中,介绍了价值观Winform开发框架、古板WCF开发框架、离线式WCF开发框架、混合式WCF开发框架,其中前边二种就是豪门比较了解的框架了,前边的离线式WCF开发框架,我在《Winform开发之离线式WCF开发框架的达成介绍》一文中也做了讲演,离线式的WCF开发框架,可以看作为古板Winform开发框架+WCF同步模块而成,本文继续深究那上头的框架设计和促成,重点介绍混合式WCF开发框架的陈设性思路及实际贯彻。

1、Winform数据访问方式定义

882828九五至尊手机版,观念的Winform程序模块:用以古板的数据库通信获取数据,这种格局获取数据,方便赶快,可以用于常规的业务种类的场所,用于单机版软件依旧依据局域网内的事务系统软件。

WCF的Winform程序模块:使用了WCF技术的分布式开发形式,系统可以通过中远距离的WCF服务获取数据,而不用直白和数据库相连,提升多少的安全性和可维护性,适用于互连网、局域网环境下的事体体系的搭建,是一种祥和、安全的框架应用。

混合式Winform程序模块:是指混合了传统数码访问和WCF数据访问的特点,可以在两者之间自由切换,统一了系统界面层对事情服务的调用格局,全部组件模块均落成三种方法的调用,是一种弹性化非凡好的框架应用,既可用来单机版软件可能依据局域网内的利用软件,也可以用来分布式技术的互连网环境应用。

每个技术都有其设有的合理,对于混合式的Winform程序而言,也是同样。在数码更是集中的后天,单机版的多少很难展开共享,只在肯定范围内举办利用;混合式的Winform程序,结合了Winform程序添加的感受和强有力的听从外,还整合了B/S的那种分布式特点,由此那种情势的存在生命力很强,有局地主次的操作使用Winform方式能够给客户提供充足好的界面效果体验。

 

Winform开发框架之混合型框架,可以看作是价值观winform开发框架和WCF开发框架之间能随便切换的一种双重框架,那种框架的性状是,就是把系统划分为众多万能模块(既适应WInform集成,也适应WCF集成),在不一样的场馆进行不一致的切换,而且只需经过配备参数的生成就可以已毕的跳转,这样丰富便宜模块的集成封装。

二,混合式框架的规律

混合式框架,结合了普通Winform情势和WCF访问数据的分布式框架,由此他们是根据2个跳转开关举办点名,如下示意图所示。

882828九五至尊手机版 1

为了适应模块化的表征,全部应用混合式框架的事体模块,除了贰个运营的主程序模块外,其余的都是多少个个独自的模块,这样便于我们业务横向的撤并,可以使大家依照统一形式进行支付,然后再拓展统一并轨,那种情势能够使得增强花费功能,并且可以使得模块可以反复使用,组合出更加多更强的政工系统模块。

上面是2个字典模块的中间设计图,大家得以观察,整个混合式的架构,分为了UI层、接口调用层、Facade接口层、Winform调用层、WCF服务调用层、业务层、实体层、以及数额库层等;其中的事务层还足以细化为BLL业务逻辑层、数据接口层、数据访问层、实体层等,整个模块通过实体层开展数据的传导载体。

882828九五至尊手机版 2

 

1、混合型框架的性情

混合型框架具有下边多少个特征:

 
 1)环境适应性强,模块可重用性高。由于混合型框架,既可以用来传统Winform系统开发,也可以用于WCF分布式系统开发,由此环境适应性强;而且由于模块具有这个特点,可重用性更高,尤其对于通用性的模块,更是有着无可取代的优越性。

 
 2)响应质量更好。如若是Winform程序,那么就接纳直接访问数据库格局,借使是WCF调用格局,就动用WCF的专有通道举办数据处理,更好使用系统财富,高效开展数量处理。

 
 3)独立布署,更少的代码修改。全部通用模块,全体透过单独计划文件举行布局WCF的一连,缩小主配置文件的纷纷;WCF服务逻辑独立类库,可采纳多样劳动寄宿方式。

叁,混合式模块的门类协会

贰,混合型框架总体设计思路

Winform开发框架之混合型框架,如故秉承模块化的思路,能够把那个框架分为两大块,一块是任重(英文名:rèn zhòng)而道远业务连串模块(如备件管理连串),一块是各类扶助性模块(如通用权限、通用字典、通用附件管理、通用人士管理。。。。),那种两块组成,就是1个周全的系统了。

882828九五至尊手机版 3

从以上图可以看到,整个系统的事情连串模块和协理性模块,都以基于三个思路,通过接口调用开关,决定调用的是WCF服务层,照旧Winform业务层(直接访问数据库),当然界面层的调用不管是调用WCF服务层依然Winform业务层,都是基于相同的接口,大家能够把它叫做Facade层。扶助性模块则是多种常用模块的重组,他们大概是下面两种的广阔模块:通用权限模块、通用字典模块、通用附件管理模块、通用人士管理模块等等。

 882828九五至尊手机版 4

882828九五至尊手机版 5

混合型框架把业务种类的WCF服务和支持性公用模块的WCF服务分开,首先是服务分开,然后是客户端配置文件分别。

下边是多少个实在业务系列的WCF服务的截图,可以看来其中的主业务服务和基本功服务模块的服务层是分手的,那样方便管理,不至于太多太乱。

882828九五至尊手机版 6

WCF服务的客户端配置文件是分开管理的,基础服务和作业服务的布局新闻分别用不一致的文件表示,如基础模块服务的WCF配置文件为BaseWcfConfig.config,业务连串的WCF配置文件为WcfConfig.config,通过如此的诀别装置,我们在主配置文件app.Config文件之中,就爽快很多了。

    <!--WCF服务的配置文件地址-->
    <add key="BaseWcfConfig" value="BaseWcfConfig.config"/>
    <add key="WcfConfig" value="WcfConfig.config"/>

 

三,混合型框架具体贯彻

为了更具体化演绎混合型的Winform开发框架,下边作者透过援助性模块之一的通用字典模块举办介绍这几个混合型框架的切切实实贯彻。字典模块的内部结构如下所示。

 882828九五至尊手机版 7

 上图的解读如下:

1)共用类库和实体类贯穿整个框架。

2)数据库通过泛型继承方式,达成更少的代码,更丰硕的API完成。

3)多数据库接济,通过运用EnterpriseLibrary公司类库,协理八种数据库的三合一处理。

4)内置Winform和WCF二种调用达成,通过布置文件,方便自由切换。

5)UI层通过接口调用层的工厂类,达成基于Facade的接口调用(而非具体贯彻类)。

6)共用UI层,UI层的界面在Winform和WCF调用情势下,均为同壹,唯有3个UI层。

7)各层均有对应的基类,更少的代码,愈来愈多的支撑。

8)每一个独立模块,构造整个框架的生态系统。

肆,开发使用混合式Winform模块

譬如说,我们在业务逻辑层里面增添1个方法,依据客户名称获取客户列表,如下所示。 

namespace WHC.TestProject.BLL
{
    /// <summary>
    /// 客户信息
    /// </summary>
    public class Customer : BaseBLL<CustomerInfo>
    {
        public Customer() : base()
        {
            base.Init(this.GetType().FullName, System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
        }

        /// <summary>
        /// 根据客户名称获取客户列表
        /// </summary>
        /// <param name="name">客户名称</param>
        /// <returns></returns>
        public List<CustomerInfo> FindByName(string name)
        {
            string condition = string.Format("Name like '%{0}%'", name);
            return baseDal.Find(condition);
        }
    }
}

图上蔚蓝部分的函数是大家新增的始末,完毕这几个函数,大家来探望落成整个混合式框架,须求充实哪些东西。

1)添加Facade接口

为了统一的接口调用必要,要求先定义Facade层的接口,那是全部的发端。

namespace WHC.TestProject.Facade
{
    [ServiceContract]
    public interface ICustomerService : IBaseService<CustomerInfo>
    {               
        /// <summary>
        /// 根据客户名称获取客户列表
        /// </summary>
        /// <param name="name">客户名称</param>
        /// <returns></returns>
        [ServiceContract]
        List<CustomerInfo> FindByName(string name);
    }
}

 

2)增添Winform接口调用层完成

依照Winform的达成,就是依照接口封装对作业逻辑层BLL的调用,BaseLocalService基类,可以当作是兼备不荒谬增删改查等等的基础性API,是依照泛型的强类型接口基类。

namespace WHC.TestProject.WinformCaller
{
    /// <summary>
    /// 基于传统Winform方式,直接访问本地数据库的Facade接口实现类
    /// </summary>
    public class CustomerCaller : BaseLocalService<CustomerInfo>, ICustomerService
    {
        private Customer bll = null;

        public CustomerCaller() : base(BLLFactory<Customer>.Instance)
        {
            bll = baseBLL as Customer;
        }

        /// <summary>
        /// 根据客户名称获取客户列表
        /// </summary>
        /// <param name="name">客户名称</param>
        /// <returns></returns>
        public List<CustomerInfo> FindByName(string name)
        {
            return bll.FindByName(name);
        }
    }
}

 

3)增添WCF的接口调用层完成

按照WCF的兑现,就是依照接口封装对WCF服务层的调用,BaseWCFService基类,可以作为是享有符合规律增删改查等等的基础性API,是依据泛型的强类型接口基类。

namespace WHC.TestProject.ServiceCaller
{
    /// <summary>
    /// 基于WCF服务的Facade接口实现类
    /// </summary>
    public class CustomerCaller : BaseWCFService<CustomerInfo>, ICustomerService
    {
        public CustomerCaller()  : base()
        {    
            this.configurationPath = EndPointConfig.WcfConfig; //WCF配置文件
            this.endpointConfigurationName = EndPointConfig.CustomerService;
        }

        /// <summary>
        /// 子类构造一个IChannel对象转换为基类接口,方便给基类进行调用通用的API
        /// </summary>
        /// <returns></returns>
        protected override IBaseService<CustomerInfo> CreateClient()
        {
            return CreateSubClient();
        }

        /// <summary>
        /// 创建一个强类型接口对象,供本地调用
        /// </summary>
        /// <returns></returns>
        private ICustomerService CreateSubClient()
        {
            CustomClientChannel<ICustomerService> factory = new CustomClientChannel<ICustomerService>(endpointConfigurationName, configurationPath);
            return factory.CreateChannel();
        }

        /// <summary>
        /// 根据客户名称获取客户列表
        /// </summary>
        /// <param name="name">客户名称</param>
        /// <returns></returns>
        public List<CustomerInfo> FindByName(string name)
        {
            List<CustomerInfo> result = new List<CustomerInfo>();

            ICustomerService service = CreateSubClient();
            ICommunicationObject comm = service as ICommunicationObject;
            comm.Using(client =>
            {
                result = service.FindByName(name);
            });

            return result;
        }
    }
}

 

出于WCF的接口封装层相对内容相比较复杂一些,那里介绍一下。

构造函数通过代码指定具体的布局文件:this.configurationPath =
EndPointConfig.WcfConfig; //WCF配置文件

并透过代码指定具体的WCFEndPoint节点名称:this.endpointConfigurationName
= EndPointConfig.CustomerService;

布局WCF服务的代理类,大家透过CustomClientChannel的帮手方法,传入配置文件和配置节点名称,使得它能八面后珑通过函数 CreateSubClient 结构出3个对应品种的WCF代理类。

            CustomClientChannel<ICustomerService> factory = new CustomClientChannel<ICustomerService>(endpointConfigurationName, configurationPath);
            return factory.CreateChannel();

 

每一遍调用WCF服务类接口的时候,大家就动用创制的代理类举行调用,调用操作如下所示。

            ICustomerService service = CreateSubClient();
            ICommunicationObject comm = service as ICommunicationObject;
            comm.Using(client =>
            {
                result = service.FindByName(name);
            });

 

4)扩大WCF服务逻辑层的兑现

我们经过地点的代码可以精通到,已经创办了Winform的调用层、WCF服务的调用层,不过此地,大家对WCF服务还尚未落到实处,那样我们就要求贯彻WCF服务层的内容了,否则程序试用WCF形式访问的时候,就找不到这么些FindByName的接口完成了。

882828九五至尊手机版 8

咱俩看看WCF服务层里面,看看现实怎么达成,双击打开其中的Customer瑟维斯.Svc看到只是贰个劳务的表明,没有其他背后的代码逻辑。

因为为了便于管理,WCF服务一般是概念和具体的落实是分手的,那样就引入了二个WCF服务逻辑层的定义。

882828九五至尊手机版 9

诸如此类它的接口已毕,就位于了WHC.TestProject.WCFLibrary项目里面了,WCF服务逻辑层的接口调用封装如下所示。那里大家见到,他和Winform的调用逻辑大致一致,只是她们的类名称不相同而已。

namespace WHC.TestProject.WCFLibrary
{
    /// <summary>
    /// 基于WCFLibrary的Customer对象调用类
    /// </summary>
    public class CustomerService : BaseLocalService<CustomerInfo>, ICustomerService
    {
        private Customer bll = null;

        public CustomerService() : base(BLLFactory<Customer>.Instance)
        {
            bll = baseBLL as Customer;
        }

        /// <summary>
        /// 根据客户名称获取客户列表
        /// </summary>
        /// <param name="name">客户名称</param>
        /// <returns></returns>
        public List<CustomerInfo> FindByName(string name)
        {
            return bll.FindByName(name);
        }
    }
}

 

四,项目文件的三结合

方方面面混合型框架的字典模块,依据上边的架构设计,会有很多项目工程暴发,由于人的靶子识别管理数据有限,因而就单个模块而言,不宜发生过多的花色DLL,否则集成会相比较困难,也不得当更好的护卫。由此,基于最少DLL的口径,小编设计了下边的模块目录,基本上,各个目录代表多少个拨出。

882828九五至尊手机版 10  

鉴于是上述框架也合并了根据WCF形式的调用情势,那么还索要成立二个WCF的字典服务,大家为了使得WCF辅助越多种的下榻方式,能够创立WCF服务库项目,如下所示那体系型。

882828九五至尊手机版 11

成立了相应的分段和逻辑类后,具体的品类工程如下(部分文件由于多少个品种中动用到,于是通过引用形式防止拷贝,又能集中管理,如Facade层的接口文件)。

882828九五至尊手机版 12

当然还会有二个WCF服务的下榻格局,那里透过IIS方式宣布,如若须求也足以由此任何方式陈设WCF服务,由于把逻辑隔离了,因而陈设充足有利。

IIS安顿格局的WCF服务工程如下所示。

882828九五至尊手机版 13

 对于IIS方式的布置,其实基本上也是在svc文件中两行代码即可(注意那一个SVC文件并未后台.cs文件)

882828九五至尊手机版 14

当然,还有一种办法,只必要安排Web.Config,不须求追加svc文件,也能落到实处WCF服务的计划的哦。

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
      <serviceActivations>
        <add service="WHC.Dictionary.WCFLibrary.DictTypeService" relativeAddress="test.svc"/>
      </serviceActivations>
    </serviceHostingEnvironment>

以上就是本人对此混合型开发框架的演绎进度,整个框架如今已近全体做到,蕴涵完毕了通用权限管理连串模块,通用字典模块,通用附件管理模块,通用人士管理模块等这几个外围通用的模块,因而框架的统筹是进过实践注脚过的,这样的混合型框架,格外适合用于重用性十分高的门类场景中,比较其他品种的框架,更兼具高附加值,高可用性的性状。

可望经过自己的混合型的框架设计思路和促成逻辑等方面的介绍,引玉之砖,能和豪门做更深的联络和剖析。 

5)界面层的调用操作 

 界面层的调用操作代码如下所示。

string name = "张"
List<CustomerInfo> list= CallerFactory<ICustomerService>.Instance.FindByName(name)

 那几个操作情势,和平日应用BLLFactory的点子要命相像的。

 

伍,混合式框架的业务模块组成

混合型框架可以看作是Winform框架高级版本,除了它本人是二个全部的事务种类外,它外围的装有帮助性模块均(如通用权限、通用字典、通用附件管理、通用人士管理。。。。)都完结了那种混合型的框架,由此使用尤其有利,整个框架借使简化来看,就是在原有的Winform界面层,用接口调用情势,幸免和事情逻辑类的紧耦合关系。由于他是通过接口格局的调用格局,它本人又足以经过部署指定指向WCF的兑现,因此也包括了WCF框架的一切特点。

882828九五至尊手机版 15

虽说全部性的混合型框架比任何二种框架模块,总体增添了部分难度及复杂性,可是,为了使得整个混合型框架开发和采纳尤其惠及,小编早已在规划上做了不少有关的干活,力求更好、更快捷的利用好那种混合型框架,下边是自个儿对全部性的框架做了的优化创新工作。

1)把具有通用的模块开发好,方便更好的集成应用,越发便捷利用通用模块,重复使开支更高;

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

3)统一的政工调用规则和命名规则,全体模块的接口调用统一为CallerFactory<I***Service>格局,通用模块和框架的命名规则和体制完全一样。

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

5)最终一条,也是最根本的一条,就是代码生成工具Database2Sharp的一块帮助。通过代码生成工具,更好、更快的生成整个混合性框架的代码和档次工程,一键消除全部的愤懑。Winform界面,利用代码生成工具Database2Sharp进行转变,然后在品种中结成即可。

 

稳中求进开发WInform项目–两种小说导引:

稳中求进开发WinForm项目(5)–Excel数据的导入导出操作

稳中求进开发WinForm项目(4)–Winform界面模块的购并应用

稳中求进开发WinForm项目(3)–Winform界面层的项目设计

稳中求进开发WinForm项目(2)–项目代码的剖析

 《稳中求进开发WinForm项目(1)
–数据库设计和花色框架的变更

 

相关文章

Your Comments

近期评论

    功能


    网站地图xml地图