在 前一章 介紹了YbRapidSolution for WinForm 代碼生成插件的一些特性,本章將對其生成的 WinForm 項目的總體架構進行分享,同時將對各個層次組件的選擇理由和特點進行簡要分析,最后將提供 N-Tier 部署的 Demo 下載。
首先來看看總體架構圖:

1、核心層(YbRapidSolution Core):
主要聲明了一系列的公共接口,提供了一些基類,擴展方法、Helper等。
2、 POCO實體:
這不用過多介紹,也就是Entity Framework的Code First實體對象,生成的代碼示例如下:
POCO 實體
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配置方式:
Web.Config
< 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。
