在 前一章 介绍了YbRapidSolution for WinForm 代码生成插件的一些特性,本章将对其生成的 WinForm 项目的总体架构进行分享,同时将对各个层次组件的选择理由和特点进行简要分析,最后将提供 N-Tier 部署的 Demo 下载。
首先来看看总体架构图:
1、核心层(YbRapidSolution Core):
主要声明了一系列的公共接口,提供了一些基类,扩展方法、Helper等。
2、 POCO实体:
这不用过多介绍,也就是Entity Framework的Code First实体对象,生成的代码示例如下:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using YbRapidSolution.Core.Infrastructure;
namespace YbRapidSolution.Entities
{
/// <summary>
/// 产品类别
/// </summary>
public partial class Categories: IAggregateRoot
{
[NotMapped]
public object Key
{
get { return this.CategoryID; }
set { this.CategoryID = ( int) value; }
}
#region 构造器
public Categories()
{
}
#endregion
#region 实体属性
#region ID
/// <summary>
/// ID
/// </summary>
[Display(Name = " ID ")]
[Key]
[Required(ErrorMessage = " 必须输入 ")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int CategoryID { get; set; }
#endregion
#region 名称
/// <summary>
/// 名称
/// </summary>
[Display(Name = " 名称 ")]
[Required(ErrorMessage = " 必须输入 ")]
[StringLength( 15, ErrorMessage = " 超过允许的字符数 ")]
public string CategoryName { get; set; }
#endregion
#region 描述
/// <summary>
/// 描述
/// </summary>
[Display(Name = " 描述 ")]
[StringLength( 1073741823, ErrorMessage = " 超过允许的字符数 ")]
public string Description { get; set; }
#endregion
#region 图片
/// <summary>
/// 图片
/// </summary>
[Display(Name = " 图片 ")]
public System.Byte[] Picture { get; set; }
#endregion
#region 产品集合
/// <summary>
/// 产品集合
/// </summary>
public virtual ICollection<Products> Products{ get; set; }
#endregion
#endregion
#region ToString()
public override string ToString()
{
return CategoryName.ToString();
}
#endregion
}
}
如果你要在开发过程中添加实体,你也可以在YbSoftwareFactory中单独生成:
3、数据访问层(Entity Framework实体框架):
数据访问层比较著名的框架有Entity Framework和NHiberate等,二者都是非常强大的ORM工具,都能根据模型自动生成数据库。现在对其主要的特性进行一番比较:
1)Entity Framework对 Linq的支持比较好,NHiberate则有强大的hql。
2)性能方面,NHiberate内置二级缓存,对于Web具有更好的性能。
3)NHiberate的ID主键生成策略非常丰富和灵活。
4)Entity Framework具有跟踪变更功能。
5)Entity Framework和.NET的有关技术结合得更紧密,更容易上手。
对WinForm等客户端而言,综合考虑后,YbRapidSolution选用Entity Framework作为ORM框架。
4、Repository(CSLA.NET 对象工厂):
本层主要是实现了CSLA.NET的对象工厂,实现对象的持久化操作。
Repository层的对象均继承自CSLA.NET的ObjectFactory类,主要实现了Create,Fetch,Update和Delete四个持久化方法。
5、服务层:
服务层是CSLA.NET功能强大的体现之一,通过简单的配置,就可在N-Tier层部署和本地部署之间切换。CSLA.NET通过DataPortal(数据门户)实现N-Tier部署下的数据通信。在N-Tier层部署模式下,服务层及以下的组件都可以部署到服务器上而无需同时在客户端部署。使用CSLA.NET,服务层你几乎不用编写任何代码,并且可以自由选择使用IIS、Windows Server AppFabric、Window Azure、Windows Activiation 服务、自定义 Windows 服务等多种宿主方式,同时能供ASP.NET、WinForm、WPF、Silverlight、WP7等多种类型的应用程序调用。
服务层典型的Web.Config内容如下,想了解CSLA.NET的可关注一下,使用的是典型的WCF配置方式:

< sectionGroup name ="yb.security" >
< section name ="permission" type ="Yb.Web.Security.PermissionProviderSection, Yb.Web.Security" />
</ sectionGroup >
< sectionGroup name ="yb.data" >
< section name ="concreteData" type ="Yb.Data.Provider.ConcreteDataProviderSection,Yb.Data.Provider" />
< section name ="hierarchyData" type ="Yb.Data.Provider.HierarchyDataProviderSection,Yb.Data.Provider" />
</ sectionGroup >
< section name ="log4net" type ="System.Configuration.IgnoreSectionHandler" />
</ configSections >
< appSettings >
< add key ="CslaAuthentication" value ="Membership" />
< add key ="CslaAuthorizationProvider" value ="YbRapidSolution.AppServices.AuthorizeDataPortal, YbRapidSolution.AppServices" />
< add key ="CslaWriter" value ="Csla.Serialization.Mobile.CslaBinaryWriter, Csla" />
< add key ="CslaReader" value ="Csla.Serialization.Mobile.CslaBinaryReader, Csla" />
< add key ="ObjectFactoryAssembly" value ="YbRapidSolution.Repository" />
< add key ="CslaObjectFactoryLoader" value ="YbRapidSolution.Library.FactoryLoader,YbRapidSolution.Library" />
</ appSettings >
< system.serviceModel >
<!-- <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> -->
< services >
< service name ="Csla.Server.Hosts.WcfPortal" behaviorConfiguration ="returnFaults" >
< endpoint contract ="Csla.Server.Hosts.IWcfPortal" binding ="wsHttpBinding" bindingConfiguration ="wsHttpBinding_IWcfPortal" />
</ service >
< service name ="Csla.Server.Hosts.Silverlight.WcfPortal"
behaviorConfiguration ="returnFaults" >
< endpoint binding ="basicHttpBinding" bindingConfiguration ="basicHttpBinding_IWcfPortal"
contract ="Csla.Server.Hosts.Silverlight.IWcfPortal" />
</ service >
</ services >
< bindings >
< basicHttpBinding >
< binding name ="basicHttpBinding_IWcfPortal"
maxReceivedMessageSize ="2147483647"
maxBufferPoolSize ="2147483647"
maxBufferSize ="2147483647" >
< readerQuotas maxBytesPerRead ="2147483647"
maxArrayLength ="2147483647"
maxStringContentLength ="2147483647"
maxNameTableCharCount ="2147483647"
maxDepth ="2147483647" />
</ binding >
</ basicHttpBinding >
< wsHttpBinding >
< binding name ="wsHttpBinding_IWcfPortal"
maxReceivedMessageSize ="2147483647" >
< readerQuotas maxBytesPerRead ="2147483647"
maxArrayLength ="2147483647"
maxStringContentLength ="2147483647"
maxNameTableCharCount ="2147483647"
maxDepth ="2147483647" />
< security mode ="None" />
</ binding >
</ wsHttpBinding >
</ bindings >
< behaviors >
< serviceBehaviors >
< behavior name ="returnFaults" >
< serviceDebug includeExceptionDetailInFaults ="true" />
<!-- <serviceAuthorization impersonateCallerForAllOperations="true" /> -->
</ behavior >
</ serviceBehaviors >
</ behaviors >
</ system.serviceModel >
6、业务逻辑层(CSLA.NET):
业务逻辑层可供选择的框架主要有CSLA.NET和DevForce。
其实DevForce更应该看作是一个数据访问层的组件,放在这里和CSLA.NET做比较是因为二者有很多相似之处。例如,二者都支持N-Tier部署,经过简单的配置就可在N-Tier层部署和本地部署之间切换,编写的代码可同时供ASP.NET、WinForm、WPF、Silverlight、WP7等多种类型的应用程序调用;都支持身份认证、授权等;完整的验证模型等。DevForce的官方地址是:http://www.ideablade.com/。
DevForce的实现基于Entity Framework,提供离线模式,甚至经过简单的配置就能把不同的实体映射到不同的数据库连接上;支持服务器端数据推动模式(无需轮询,这对于某些应用下提高性能大有帮助),编写少量代码就可实现把数据从服务器端推送至WinForm客户端、WPF客户端和Silverllght客户端;更加方便的查询和分页等。可以说也是非常的强大,不过Express版仅支持10个实体。总体来说,DevForce和数据访问功能的联系要比 CSLA.NET 更加紧密。
选用CSLA.NET的主要原因是其不仅具有N-Tier部署能力,还具有完整的对象状态跟踪、身份认证与授权、实体验证(YbRapidSolution for WinForm 使用了.NET 4.0的DataAnnotations进行验证,CSLA.NET提供了完美的支持和集成)等功能,并且支持N层撤消与灵活的业务逻辑规则的制定。CSLA.NET充分考虑了界面层的一下需求,例如,界面层判断对象是否修改并对用户进行提示之类的具有超强用户体验的功能就是建立在对CSLA.NET的对象状态跟踪的基础之上的。
CSLA.NET教程中有句非常经典的话是:“对于数据库设计而言,有统一的标准规范可循(例如数据库设计的范式),而对于面向对象的设计而言,却没有统一的设计标准和规范,设计具有很大的随意性;数据库设计往往看重的是对结构的规范,而对面向对象的设计来说,往往需要优先考虑的是对对象的行为进行规范”。
根据这个指导思想,CLSA.NET主要根据对象的普遍行为设计了八种类型的基类对象,你可根据对象的具体行为选择合理的基类并实现它,具体的业务逻辑层主要就是建立在这八种对象的具体实现上。同时,为实现N-Tier部署的功能,这些对象均是可序列化的,这也是CSLA.NET的显著特征之一。当然,CSLA.NET也比较抽象,学习成本较高。
7、界面层(DevExpress):
选DevExpress作为界面层的主要原因是其不仅界面美观,而且功能也相当强大。界面不仅作为人机交互的接口,在很大程度上也是对产品的包装,在一把手工程流行的年代,一套美观、易用的界面在很大程度上决定了项目的成败和产品的价值。VB时代曾经使用过Component One组件, Telerik控件看似也不错,但没用过无从比较。
附一:YbRapidSolution for WinForm Demo下载:运行环境-.NET 4.0。服务层部署在 Internet 上,,可直接运行;如需在本地部署,除了安装数据库外,就是修改配置文件,这里不再详述。
附二:YbSoftwareFactory V2.2 下载,运行环境-.NET 4.0。