将 Flex 应用程序与 NHibernate 集成






4.75/5 (6投票s)
本文介绍如何使用 Flex、Flash Builder、WebORB 和 NHibernate(.NET 框架的开源对象关系映射器)来简化 Web 应用程序开发。
随着 Web 的不断发展,对更具交互性和可用性的 Web 应用程序的需求日益增加。用户要求他们在互联网上使用的工具在行为上更像桌面应用程序,而不是功能零散的网页。
“富 Internet 应用程序 (RIA)”一词指的是一种利用现有 Web 标准为用户提供更丰富体验的设计模式。开发 RIA 时有多种平台和技术可供选择,找到合适的组合可能具有挑战性。与大多数多技术应用程序一样,如果不对平台之间的集成进行仔细规划和定期维护,保持清晰的集成可能会变得极其复杂。
在本教程中,我将演示一种特别易于使用的技术组合,它可以很好地让您专注于开发功能,而不是维护底层技术。现代开发工具结合 WebORB for .NET 和 NHibernate,可以更轻松地维护集成点。NHibernate 等数据访问开发框架消除了开发人员通常需要编写和维护的大量粘合代码。这降低了复杂性,并为 RIA 的快速开发创造了一个稳固的环境。
在本教程中,您将学习如何设置环境,开发一个基于 Adobe Flex 的 RIA,该 RIA 通过 WebORB 和 NHibernate 连接到 Microsoft .NET 后端,从而实现清晰的开发和 Flex 与 .NET 项目的同步调试。
项目概述
为更清晰地说明本文介绍的概念,示例项目被故意保持简单,其代码结构省略了生产应用程序中的一些常见功能。目标是展示如何将应用程序架构中的各个组件连接起来。
应用程序用例
一家零售产品制造商为订购某些产品的客户推出一项促销活动,赠送免费冒险假期。该公司需要一个简单的界面,供客户输入信息并请求特定的冒险活动和预订日期。该公司还为公司员工提供后台界面,以审查请求并访问客户联系信息。
在本教程中,将在 Flash Builder 中构建一个简单的用户界面(参见图 1)。为简化起见,最终用户提交表单和后台数据审查表单同时显示,尽管在生产环境中它们显然会被分开。
应用程序架构
本项目应用程序基于基本的 3 层分布式系统架构,该架构可很好地进行水平和垂直扩展。
此应用程序架构(参见图 2)依赖于 WebORB 和 NHibernate 来提供各层之间的粘合。这不仅使您(作为开发人员)不必担心集成这些层的实现细节,而且还减少了您需要编写的代码量。对于此类项目,所有开发人员代码仅分为两类:
- 数据模型 – POCO(纯旧类对象)– 这些是表示您公开的数据对象的 .NET 类。这些类被编码为封装类,它们不了解使用它们的服务。
-
Flex 应用程序 – 这是用户交互的主要应用程序,在本例中是一个简单的 Flex 应用程序,不包含任何第三方框架。
项目设置
仔细设置 RIA 项目很重要,以避免在执行调试等常见任务时产生额外工作。这些说明将使您能够同时在 Flash Builder 和 Visual Studio 中进行开发和调试。
Visual Studio 项目设置
大部分详细的设置步骤都在 Visual Studio 端,因为应用程序配置和 WebORB 及 NHibernate 框架的平台都是基于 .NET 的。
- 在您的系统上创建一个名为 Redeem 的新文件夹,其中将包含 .NET 和 Flex 项目的文件。
- 以管理员身份启动 Visual Studio。
- 在 Redeem 文件夹中创建一个名为 RedeemSite 的新 ASP.NET 空 Web 应用程序(参见图 3)。请确保取消选中“为解决方案创建目录”选项。
- 在解决方案资源管理器中右键单击 RedeemSite 项目,然后打开项目属性页。
- 在项目属性页中单击“Web”选项卡(参见图 4)。
- 选择“使用本地 IIS Web 服务器”。
- 在“项目 URL”中键入 https:///Redeem。
- 选择“覆盖应用程序根 URL”
- 在“覆盖根 URL”中键入 https:///Redeem
- 单击“创建虚拟目录”
- 在“启动 URL”中键入 https:///Redeem
注意:要同时成功调试 Flex 和 .NET 应用程序,必须将 .NET 项目部署到 IIS。
- 向解决方案添加一个名为 RedeemModel 的新类库项目,该项目位于您在步骤 1 中创建的 Redeem 文件夹下。
- 删除 Visual Studio 生成的 Class1.cs 文件。
- 在解决方案资源管理器中右键单击 RedeemModel 项目,然后打开项目属性页。
- 在“应用程序”选项卡下,将默认命名空间更改为 RedeemSite.Models。
- 在 RedeemSite Web 项目中添加以下引用(参见图 5),将“NHibernate-2.1.2.GA-bin”替换为您的 NHibernate 安装路径。
- NHibernate-2.1.2.GA-bin\Required_Bins\NHibernate.dll
- NHibernate-2.1.2.GA-bin\Required_For_LazyLoading\LinFu\NHibernate.LinFu.ByteCode.dll
- NHibernate-2.1.2.GA-bin\Required_For_LazyLoading\Spring\NHibernate.ByteCode.Spring.dll
- 同样,在 RedeemSite Web 项目中添加对 RedeemModel 项目的项目引用。
-
选择 NHibernate 程序集的引用,并确保“复制本地”属性设置为 True(参见图 6)。WebORB 需要 NHibernate 的本地副本才能读取映射并定位模型类。
- 编辑 web.config 文件,并用以下内容替换其内容
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpHandlers>
<add verb="*" path="weborb.aspx" type="Weborb.ORBHttpHandler" />
<add verb="*" path="codegen.aspx"
type="Weborb.Management.CodeGen.CodegeneratorHttpHandler" />
<add verb="*" path="dcd.aspx" type="Weborb.RDS.Handler.FrontEndHttpHandler"/>
</httpHandlers>
</system.web>
<system.webServer>
<handlers>
<add name="codegen.aspx_*" path="codegen.aspx" verb="*"
type="Weborb.Management.CodeGen.CodegeneratorHttpHandler"
preCondition="integratedMode,runtimeVersionv4.0" />
<add name="weborb.aspx_*" path="weborb.aspx" verb="*"
type="Weborb.ORBHttpHandler" preCondition="integratedMode,runtimeVersionv4.0" />
<add name="dcd.aspx_*" path="dcd.aspx" verb="*"
type="Weborb.RDS.Handler.FrontEndHttpHandler"
preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
</configuration>
- 将以下 WebORB 文件从您的 WebORB 安装目录复制到 RedeemSite 项目文件夹(注意:不要将这些文件包含在 .NET 项目中)
/weborb.config /bin/weborb.dll /bin/MySql.Data.dll /bin/Mono.Security.dll /bin/Npgsql.dll /diagnostics.aspx /WEB-INF /weborbconsole.html /console /weborbassets /logs
- 在 RedeemSite 项目的 bin 文件夹中创建一个名为 hibernate.cfg.xml 的新 XML 文件。
- 将以下内容保存到文件中
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.provider">
NHibernate.Connection.DriverConnectionProvider
</property>
<property name="dialect">
NHibernate.Dialect.MsSql2008Dialect
</property>
<property name="connection.driver_class">
NHibernate.Driver.SqlClientDriver
</property>
<property name="connection.connection_string">
<PUT YOUR CONNECTION STRING HERE>
</property>
<property name="show_sql">
True
</property>
<property name='proxyfactory.factory_class'>
NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu
</property>
</session-factory>
</hibernate-configuration>
- 将连接字符串(
<PUT YOUR CONNECTION STRING HERE>
)替换为适合您环境的连接字符串。您也可以根据您正在运行的 RDBMS 的类型更改方言和驱动程序。所有 NHibernate 驱动程序和方言分别位于 NHibernate.Dialect 和 NHibernate.Driver 命名空间中。有关当前可用的驱动程序和方言列表,请参阅 NHibernate 文档。
注意:本教程不包括将应用程序架构部署到数据库所需的步骤。本教程是使用 SQL Server 2008 R2 构建的,并为该服务器提供了一个脚本。您可能需要根据您的特定服务器调整提供的脚本。
Flex 项目设置
Flex 项目是暴露在 WebORB 下的服务的前端客户端。让 Flex 与 .NET 后端协同工作需要做的工作很少,因为 WebORB 负责服务实现的细节以及从 Flex 应用程序设置和调用服务的细节。
请按照以下步骤进行设置
- 启动 Flash Builder。
- 使用 Redeem 文件夹作为其位置创建新的工作区(选择文件 > 切换工作区 > 其他)。
-
选择文件 > 新建 > Flex 项目来创建一个新的 Flex 项目。
- 在“项目名称”中键入 RedeemApp(参见图 7),然后单击“下一步”。
- 在“输出文件夹”中,键入 RedeemSite 项目的路径(…/Redeem/RedeemSite)(参见图 8)。
- 单击“下一步”。
- 在“主应用程序文件”中键入 index.mxml 。
- 在“输出文件夹 URL”中,键入 https:///Redeem(参见图 9)。
- 单击“完成”。
- 右键单击新项目,然后选择“属性”。
- 在“属性”对话框中单击“Flex 编译器”部分,并添加以下编译器参数:
–services "x:[您的 Redeem 站点路径]/WEB-INF/flex/services-config.xml"
。将x:[您的 Redeem 站点路径]
替换为您的站点路径。 - 确保新的 Flex 项目能够成功生成,并且生成的文件被复制到 RedeemSite 项目文件夹。注意:不要将这些文件包含在 .NET 项目中。
此时,您应该能够运行和调试两个项目。启动时,每个项目都应该启动 IIS 站点,并在自动生成的 index.html 文件中显示空的 Flex 应用程序。
WebORB 配置
接下来,通过测试应用程序中的 WebORB 部署来验证设置,以确保其按预期工作。
- 保存 Flex 和 .NET 应用程序的所有文件,然后运行 .NET 应用程序。空 Flex 项目应默认在浏览器中打开。
- 将浏览器 URL 更改为 https:///Redeem/diagnostics.aspx。如果您遇到任何错误或失败,请排除配置故障以解决问题。
- 将浏览器 URL 更改为 https:///Redeem/weborbconsole.html,并确保控制台加载时没有任何错误或缺失的 UI 元素。
.NET 开发
到目前为止,本教程的很大一部分内容都集中在设置 .NET 环境。这项工作现在将转化为后端代码的减少。有了已有的数据库,NHibernate 提供到该数据库的连接,以及 WebORB 4.2 的新 NHibernate 集成,您只需编写一个类。
- 返回到您之前在 Visual Studio 中创建的 RedeemModel 类库项目。
- 在该项目中创建一个新类,并将其命名为 RedemptionModel.cs。
这个单一的 POCO 将不包含对任何更高级别框架的引用。此类仅包含将充当数据库字段数据容器的属性。为简化配置,属性名称与数据库中使用的字段名称匹配。
请记住,为供 NHibernate 使用而创建的 POCO 必须遵循两个规则:
- 所有属性都必须声明为 virtual
- 所有属性都必须提供 getter 和 setter
- 将以下代码添加到 RedemptionModel.cs
public class RedemptionModel
{
public virtual Guid PrimaryKey { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string AddressLine1 { get; set; }
public virtual string AddressLine2 { get; set; }
public virtual string Apartment { get; set; }
public virtual string City { get; set; }
public virtual string State { get; set; }
public virtual string ZipCode { get; set; }
public virtual string PhoneNumber { get; set; }
public virtual string EmailAddress { get; set; }
public virtual string OrderNumber { get; set; }
public virtual string ItemSelection { get; set; }
public virtual DateTime RequestedBookingDate { get; set; }
public virtual bool TermsAgreed { get; set; }
public virtual DateTime AgreementDate { get; set; }
public virtual DateTime SubmissionDate { get; set; }
public virtual string IPAddress { get; set; }
}
接下来,您需要创建一个映射文件。此文件将上一步中编写的 POCO 映射到数据库表和字段。该文件还充当 NHibernate 和 WebORB 的 NHibernate 集成的定位器。
- 您可以从示例文件中复制代码,其中包含 RedemptionModel.cs 的完整实现。
- 在 RedeemModel 项目中创建一个名为 Mappings 的文件夹。
- 在该文件夹内创建一个名为 RedemptionModel.hbm.xml 的新 XML 文件。
文件名必须与被映射类的名称匹配,并且必须包含 ".hbm" 部分。
- 将以下映射定义插入并保存到新创建的 XML 文件中
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="RedeemModel"
namespace="RedeemSite.Models">
<class name="RedemptionModel" table="RedemptionRequests">
<id name="PrimaryKey">
<generator class="guid" />
</id>
<property name="FirstName" />
<property name="LastName" />
<property name="AddressLine1" />
<property name="AddressLine2" />
<property name="Apartment" />
<property name="City" />
<property name="State" />
<property name="ZipCode" />
<property name="PhoneNumber" />
<property name="EmailAddress" />
<property name="OrderNumber" />
<property name="ItemSelection" />
<property name="RequestedBookingDate" />
<property name="TermsAgreed" />
<property name="AgreementDate" />
<property name="SubmissionDate" />
<property name="IPAddress" />
</class>
</hibernate-mapping>
最后,必须将映射文件设置为 RedeemModel 项目的嵌入式资源,以便 NHibernate 和 WebORB 可以找到它。
-
选择文件,并在文件属性中将“生成操作”更改为“嵌入的资源”(参见图 10)。
应用程序的后端部分现在已完成。WebORB 和 NHibernate 将使用提供的类和映射文件与应用程序的其他层集成。
WebORB 代码生成
在生成 Flex 应用程序之前,您需要创建 Flex 应用程序需要使用的代码。WebORB 在管理控制台中提供了一套工具,用于定位后端类并为使用者应用程序生成代码。
- 启动浏览器并导航到 WebORB 控制台的 URL:https:///Redeem/weborbconsole.html。
-
单击“服务”选项卡。WebORB 控制台的“服务”选项卡提供了对所有公共类和方法的便捷访问。当检测到 NHibernate 库和配置时,WebORB 会自动提供 NHibernate 集成。
- 展开 NHibernate 对象服务(参见图 11)。
- 展开 RedeemSite 命名空间。
- 选择 NHibernateSession。
- 单击“下载代码”(保持“生成项目文件”未选中)。将下载一个 ZIP 存档;其内容是集成所需的源文件。
生成的代码代表图 2 中显示的 WebORB 生成的服务抽象组件。代码包含一个视图对象(vo),它是 .NET 项目中 RedemptionModel 类的 Flex 表示。还生成了一些类来支持 Flex 中的服务调用抽象,以及一个支持所有主要 CRUD 操作以及直接 HQL 和 SQL 查询的 NHibernateSession 类。
Flex 开发
后端已完成,并且 WebORB 控制台的生成代码已就绪,您可以将 Flex 应用程序与后端集成并开发用户体验。
在 Flash Builder 中为之前创建的 RedeemApp 项目完成以下步骤:
- 从从 WebORB 控制台下载的 ZIP 存档中提取生成的代码文件,包括文件夹结构。
- 将 RedeemSite 和 weborb 文件夹复制到 RedeemApp 项目的 src 文件夹。(您可以直接将文件拖放到 Flash Builder 中。)
- 编辑 index.mxml 文件。
- 为视觉元素添加以下代码
<!-- Top Panel containing submission form. --> <s:Panel width="322" height="430" id="submissionForm" x="255" y="10" title="WidgetCo. presents Extreme Adventures"> <s:Label x="31" y="10" text="First Name"/> <s:TextInput id="firstNameInput" x="31" y="24"/> <s:Label x="162" y="11" text="Last Name"/> <s:TextInput x="162" y="24" id="lastNameInput"/> <s:Label x="32" y="55" text="Address"/> <s:TextInput x="32" y="67" width="198" id="addressLine1Input"/> <s:Label x="232" y="55" text="Apt/Suite"/> <s:TextInput x="232" y="67" width="58" id="apartmentInput"/> <s:TextInput x="32" y="97" width="258" id="addressLine2Input"/> <s:Label x="32" y="127" text="City"/> <s:TextInput x="32" y="141" width="128" id="cityInput"/> <s:Label x="162" y="128" text="State"/> <s:TextInput x="162" y="141" width="29" id="stateInput"/> <s:Label x="195" y="128" text="Zip Code" height="16"/> <s:TextInput x="193" y="141" width="97" id="zipCodeInput"/> <s:Label x="32" y="173" text="Phone Number"/> <s:TextInput x="32" y="185" width="101" id="phoneNumberInput"/> <s:Label x="134" y="173" text="Email Address"/> <s:TextInput x="135" y="185" width="155" id="emailAddressInput"/> <s:Label x="31" y="222" text="Order Number"/> <s:Label text="Adventure Selection" x="31" y="269"/> <s:TextInput x="31" y="234" width="259" id="orderNumberInput"/> <s:DropDownList x="31" y="283" width="160" id="adventureSelectionInput" prompt="Select an adventure" dataProvider="{adventureOptions}" labelField="value" /> <s:Label text="Requested Date" x="193" y="269"/> <mx:DateField x="195" y="283" id="requestedDateInput"/> <s:CheckBox x="55" y="320" label="I agree to the terms and conditions." id="termsAgreementInput"/> <s:Button x="105" y="359" label="Submit Request" id="submitButton" enabled="true" click="submitButton_clickHandler(event)"/> </s:Panel> <!-- Bottom Panel containing data grid and controls for getting data and filtering by date --> <s:Panel width="800" height="273" x="16" y="459" id="DataReview" title="WidgetCo. Extreme Adventures Promotion Requests"> <mx:DataGrid id="submissionDataGrid" dataProvider="{reviewRequestsData}" width="790" selectable="true" x="4" y="48" height="187"> <mx:columns> <mx:DataGridColumn headerText="First Name" dataField="FirstName"/> <mx:DataGridColumn headerText="Last Name" dataField="LastName"/> <mx:DataGridColumn headerText="City " dataField="City"/> <mx:DataGridColumn headerText="State" dataField="State"/> <mx:DataGridColumn headerText="Phone" dataField="PhoneNumber"/> <mx:DataGridColumn headerText="EMail" dataField="EmailAddress"/> <mx:DataGridColumn headerText="Order" dataField="OrderNumber"/> <mx:DataGridColumn headerText="Item" dataField="ItemSelection"/> <mx:DataGridColumn headerText="Submitted On" dataField="SubmissionDate"/> </mx:columns> </mx:DataGrid> <s:Label text="Start Date" x="114" y="6"/> <mx:DateField id="startDateInput" x="114" y="18"/> <s:Label text="End Date" x="212" y="7"/> <mx:DateField id="endDateInput" x="212" y="19"/> <s:Button label="Get Requests" id="getRequestsByDateButton" click="getRequestsByDateButton_clickHandler(event)" x="310" y="19"/> <s:Button label="Get All Requests" id="getRequestsButton" click="getRequestsButton_clickHandler(event)" x="413" y="19"/> </s:Panel>
- 现在,在声明部分添加一个简单的数组。这提供了用于冒险活动选择下拉列表的数据。
<s:ArrayList id="adventureOptions"> <fx:Object value="Pro Curling Lessons" /> <fx:Object value="Race Adventure" /> <fx:Object value="Extreme Skydiving" /> </s:ArrayList>
- 为了处理用户交互并将数据与抽象代码连接起来,请直接在 MXML 中放置一个脚本块。添加必要的导入并设置一些前端使用的本地变量。
<fx:Script> <![CDATA[ //Flex Libraries import mx.binding.utils.BindingUtils; import mx.controls.Alert; import mx.rpc.Responder; import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; import mx.utils.UIDUtil; //Data model and Init classes generated by WebORB import RedeemSite.DataTypeInitializer; import RedeemSite.Models.vo.RedemptionModel; //WebORB Generated NHibernate wrapper classes import weborb.nhibernate.NHibernateSession; import weborb.nhibernate.QueryDescriptor; //Used for submisson of form private var formResponder:mx.rpc.Responder = new mx.rpc.Responder(requestResult, requestFault); //Used for loading grid data private var gridResponder:mx.rpc.Responder = new mx.rpc.Responder(getDataResult, requestFault); private var redemptionRequest:RedemptionModel = new RedemptionModel(); //Bound to the form //WebOrb Generated Flex Wrapper for NHibernate private var nhibernateSession:NHibernateSession = new NHibernateSession(); [Bindable] public var reviewRequestsData:Array; ]]> </fx:Script>
- 接下来,在
redemptionRequest
对象属性与提交表单字段之间添加绑定。
<fx:Binding source="firstNameInput.text" destination="redemptionRequest.FirstName" /> <fx:Binding source="lastNameInput.text" destination="redemptionRequest.LastName" /> <fx:Binding source="addressLine1Input.text" destination="redemptionRequest.AddressLine1" /> <fx:Binding source="addressLine2Input.text" destination="redemptionRequest.AddressLine2" /> <fx:Binding source="apartmentInput.text" destination="redemptionRequest.Apartment" /> <fx:Binding source="cityInput.text" destination="redemptionRequest.City" /> <fx:Binding source="stateInput.text" destination="redemptionRequest.State" /> <fx:Binding source="zipCodeInput.text" destination="redemptionRequest.ZipCode" /> <fx:Binding source="phoneNumberInput.text" destination="redemptionRequest.PhoneNumber" /> <fx:Binding source="emailAddressInput.text" destination="redemptionRequest.EmailAddress" /> <fx:Binding source="orderNumberInput.text" destination="redemptionRequest.OrderNumber" /> <fx:Binding source="adventureSelectionInput.selectedItem.value" destination="redemptionRequest.ItemSelection" /> <fx:Binding source="requestedDateInput.selectedDate" destination="redemptionRequest.RequestedBookingDate" /> <fx:Binding source="termsAgreementInput.selected" destination="redemptionRequest.TermsAgreed" />
- 在脚本块中,添加一个
onLoad()
事件函数和一个用于任何服务请求错误的函数。
public function onLoad():void { //This call is required to ensure Flex builds the generated files from WebORB new DataTypeInitializer(); } //General fault handler public function requestFault(e:FaultEvent):void { Alert.show("There has been an error with the data transaction", "Submission Failure"); }
- 编辑主
<s:Application>
标签并添加initialize="onLoad()"
。 - 为提交表单添加函数。首先,添加一个
requestResult
函数用于捕获成功的提交请求,以及一个提交按钮的事件处理函数。
//Handles response for submission of the form data to create a new record.
public function requestResult(e:ResultEvent):void
{
Alert.show("Your submission has been recieved.", "Submission Success");
redemptionRequest.PrimaryKey = null;
}
protected function submitButton_clickHandler(event:MouseEvent):void
{
redemptionRequest.SubmissionDate = new Date();
redemptionRequest.AgreementDate = new Date();
redemptionRequest.PrimaryKey = UIDUtil.createUID();
nhibernateSession.Save(redemptionRequest, formResponder);
}
- 最后,添加数据审查控件的方法。添加一个
getDataResult()
函数用于成功的数据请求,该函数填充网格控件。添加两个单击事件处理函数,一个用于“获取请求”按钮。
//Handles response for getting data for the grid control. Used for both
//GetAll and Get by date selection.
public function getDataResult(e:ResultEvent):void
{
submissionDataGrid.rowCount = e.result.length;
reviewRequestsData = e.result as Array;
}
protected function getRequestsButton_clickHandler(event:MouseEvent):void
{
nhibernateSession.Find("from RedemptionModel", gridResponder)
}
protected function getRequestsByDateButton_clickHandler(event:MouseEvent):void
{
var query:QueryDescriptor = nhibernateSession.CreateQuery(
"from RedemptionModel r where r.SubmissionDate >= :startDate and r.SubmissionDate <= :endDate");
query.SetNamedDateTime("startDate", startDateInput.selectedDate);
// 86400000 = milliseconds in 1 day
query.SetNamedDateTime("endDate", endDateInput.selectedDate + 86400000);
query.List(gridResponder);
}
有了这最后一部分代码,应用程序应该可以运行以提交和检索数据了。启动项目并尝试一下。
下一步
以示例应用程序为起点,您可以通过向后端添加新数据(和模型)并使用 WebORB 控制台生成新代码来轻松增强其功能。您可能想探索 NHibernate 强大的 HQL 功能,以其他方式使用现有数据。
通过将您的项目设置为上述方式,您现在可以很好地开发 RIA 应用程序,这些应用程序可以利用 Microsoft 后端技术的强大功能,结合 Adobe Flash Player 和 Flex 技术提供的跨平台/跨浏览器功能——所有这些都只需要最基础的代码和配置来将所有内容连接起来。
WebORB 的新 NHibernate 集成适用于最常见的技术场景。对于更复杂的场景,您可能需要对后端有更多的控制,这可以通过编写自己的存储库类并使用 WebORB 对这些自定义类生成代码来实现。无论哪种方式,WebORB 的集成堆栈都能节省大量时间和精力。
本教程的示例文件包括一个 IIS 7.5 部署包(附带 SQL),可以快速轻松地部署工作应用程序以便试用。我还包含了 Microsoft Azure 云服务的部署文件,如果您希望在云中使用此类应用程序。最后,您将在代码中找到第二组类和测试,它们使用手写的存储库接口与 NHibernate 进行交互,而不是自动生成的代码(以获得更多后端控制)。根据您的用例,您可能更喜欢一种方法而不是另一种。通常首选使用 WebORB 提供 NHibernate 的类,因为所需的测试和代码维护更少。