前面的章节讲解了搭建Model、DAO、BLL,完成了前面这三大块框架的搭建,基本上我们开发一个项目只剩下,也只需要写写WebUI层就行了。当然了,我们的表现层可以是WebForm、WinForm、WPF、MVC都行。本来打算用MVC,但由于团队成员对web开发不熟悉,我采用是最简单的WebForm。不管表现层使用什么,其原理都是一样的,无非就是调用到IBLL层实例,然后调用它的各种方法来处理数据而已。至于大家在第一讲中看到的Common类库就不在本次分享中讲解了,里面就是存放了常用的工具类,如提示框、数据加密解密、Excel导入导出等等。
一、配置BLL对象
接着上一节最后没有回答的问题来讲,配置BLL对象。首先,我们右键点击解决方案,添加新建项目-ASP.NET Web 窗体应用程序。添加引用:右键点击引用,选择“管理NuGet程序包”,选择“联机”,搜索“Spring.NET”,在搜索结果中选择“Spring.Net NHibernate 4 support”安装。该安装包括了一个NHibernate,但是还不够,同样的方法搜索NHibernate,并安装,除此而外还要添加Spring.Web引用,以及添加BLL、IBLL、Model、NHibernateDAO的引用。具体操作参考DAO层讲解。
然后再该项目下新建一个Config文件夹存放配置文件,再在里面添加一个名为objects.xml的xml文档,右键将其生成操作设置为“嵌入的资源”,代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
<!--T_AreaBLL,管理T_Area的对象-->
<object id="T_AreaBLL" type="BLL.T_AreaBLL, BLL">
<property name="Dao" ref="T_AreaDAO"/>
<property name="AreaDao" ref="T_AreaDAO"/>
</object>
<!--T_AssessmentCoefficientBLL,管理T_AssessmentCoefficient的对象-->
<object id="T_AssessmentCoefficientBLL" type="BLL.T_AssessmentCoefficientBLL,BLL">
<property name="Dao" ref="T_AssessmentCoefficientDAO"/>
</object>
<!--T_AuthorityBLL,管理T_Authority的对象-->
<object id="T_AuthorityBLL" type="BLL.T_AuthorityBLL,BLL">
<property name="Dao" ref="T_AuthorityDAO"/>
<property name="AuthorityDao" ref="T_AuthorityDAO"/>
</object>
<!--T_ClientBLL,管理T_Client的对象-->
<object id="T_ClientBLL" type="BLL.T_ClientBLL,BLL">
<property name="Dao" ref="T_ClientDAO"/>
</object>
<!--T_DictionaryBLL,管理T_Dictionary的对象-->
<object id="T_DictionaryBLL" type="BLL.T_DictionaryBLL,BLL">
<property name="Dao" ref="T_DictionaryDAO"/>
</object>
<!--T_DrugBLL,管理T_Drug的对象-->
<object id="T_DrugBLL" type="BLL.T_DrugBLL,BLL">
<property name="Dao" ref="T_DrugDAO"/>
</object>
<!--T_InvoicingCollectDetailBLL,管理T_InvoicingCollectDetail的对象-->
<object id="T_InvoicingCollectDetailBLL" type="BLL.T_InvoicingCollectDetailBLL,BLL">
<property name="Dao" ref="T_InvoicingCollectDetailDAO"/>
</object>
<!--T_InvoicingDetailBLL,管理T_InvoicingDetail的对象-->
<object id="T_InvoicingDetailBLL" type="BLL.T_InvoicingDetailBLL,BLL">
<property name="Dao" ref="T_InvoicingDetailDAO"/>
</object>
<!--T_LogBLL,管理T_Log的对象-->
<object id="T_LogBLL" type="BLL.T_LogBLL,BLL">
<property name="Dao" ref="T_LogDAO"/>
</object>
<!--T_MenuBLL,管理T_Menu的对象-->
<object id="T_MenuBLL" type="BLL.T_MenuBLL,BLL">
<property name="Dao" ref="T_MenuDAO"/>
</object>
<!--T_OpHistoryBLL,管理T_OpHistory的对象-->
<object id="T_OpHistoryBLL" type="BLL.T_OpHistoryBLL,BLL">
<property name="Dao" ref="T_OpHistoryDAO"/>
</object>
<!--T_RoleBLL,管理T_Role的对象-->
<object id="T_RoleBLL" type="BLL.T_RoleBLL,BLL">
<property name="Dao" ref="T_RoleDAO"/>
</object>
<!--T_UserBLL,管理T_User的对象-->
<object id="T_UserBLL" type="BLL.T_UserBLL,BLL">
<property name="Dao" ref="T_UserDAO"/>
<property name="UserDAO" ref="T_UserDAO"/>
</object>
<!--V_InvoicingCollectDetailBLL,管理V_InvoicingCollectDetail的对象-->
<object id="V_InvoicingCollectDetailBLL" type="BLL.V_InvoicingCollectDetailBLL,BLL">
<property name="Dao" ref="V_InvoicingCollectDetailDAO"/>
</object>
<!--V_InvoicingDetailBLL,管理V_InvoicingDetail的对象-->
<object id="V_InvoicingDetailBLL" type="BLL.V_InvoicingDetailBLL,BLL">
<property name="Dao" ref="V_InvoicingDetailDAO"/>
</object>
<!--V_TrackBLL,管理V_Track的对象-->
<object id="V_TrackBLL" type="BLL.V_TrackBLL,BLL">
<property name="Dao" ref="V_TrackDAO"/>
</object>
<!--V_CoverageRateBLL,管理V_CoverageRate的对象-->
<object id="V_CoverageRateBLL" type="BLL.V_CoverageRateBLL,BLL">
<property name="Dao" ref="V_CoverageRateDAO"/>
<property name="CoverageRateDao" ref="V_CoverageRateDAO"/>
</object>
<!--V_AssessBLL,管理V_Assess的对象-->
<object id="V_AssessBLL" type="BLL.V_AssessBLL,BLL">
<property name="Dao" ref="V_AssessDAO"/>
<property name="AssessDao" ref="V_AssessDAO"/>
</object>
<!--T_BuyDetailBLL,管理T_BuyDetail的对象-->
<object id="T_BuyDetailBLL" type="BLL.T_BuyDetailBLL,BLL">
<property name="Dao" ref="T_BuyDetailDAO"/>
</object>
</objects>
以id为T_RoleBLL的object节点为例,他描述的是T_RoleBLL实例化的对象是type中“命名空间.类名,命名空间”中指定的类,下面的property描述的为BLL中的属性,上一节讲解中父类BLL定义了一个IDAO<T>对象Dao,这里指定继承父类的子类T_RoleBLL实例化该Dao为property节点指定的ref属性T_RoleDAO对象,也就是指定IDAO<T>对象Dao由他的实现类的子类T_RoleDAO实例化。如果该业务逻辑层有单独实现的方法,需要单独实例化它定义的Dao,如T_AreaBLL中定义的AreaDao。需要特别注意的是:property节点中name名字必须与BLL层中定义属性名字相同,否则会报错,没有实例化成功。
调用的时候,先这样实例化:
IApplicationContext ctx = ContextRegistry.GetContext();
/// <summary>
/// T_RoleBLL实例
/// </summary>
public IBLL<T_Role> BLL
{
get { return ctx.GetObject("T_RoleBLL") as IBLL<T_Role>; }
}
同样,如果BLL层有特殊单独定义的方法,那么需要如下单独实例化:
/// <summary>
/// T_AreaBLL实例
/// </summary>
public IBLL<T_Area> IAreaBLL
{
get { return ctx.GetObject("T_AreaBLL") as IBLL<T_Area>; }
}
public IT_AreaBLL AreaBLL
{
get { return ctx.GetObject("T_AreaBLL") as IT_AreaBLL; }
}
二、Web.config配置
这里的配置大部分是固定模板,没什么好讲的,注释都很详尽,先上代码,然后说一下注意的地方:
<?xml version="1.0" encoding="utf-8"?>
<!--
有关如何配置 ASP.NET 应用程序的详细信息,请访问
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<!--Spring.NET配置 开始-->
<configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.WebContextHandler, Spring.Web" />
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
<!-- 数据库的配置参数 -->
<section name="databaseSettings" type="System.Configuration.NameValueSectionHandler" />
</sectionGroup>
</configSections>
<spring>
<context>
<resource uri="~/Config/objects.xml" />
<!-- 嵌入在程序集中的配置文件 ,首先是程序集名称,然后命名空间,最后文件名, 注意名称的大小写必须完全一致 -->
<resource uri="assembly://NHibernateDAO/NHibernateDAO.Config/DataAccess.xml" />
<resource uri="assembly://NHibernateDAO/NHibernateDAO.Config/objects.xml" />
<!--<resource uri="assembly://BLL/BLL.Config/objects.xml" />-->
</context>
<objects xmlns="http://www.springframework.net" /><!--必要-->
<!--数据库配置服务器地址-->
<databaseSettings>
<add key="db.server" value="192.168.40.221" />
<add key="db.database" value="FlowQuery" />
<add key="db.userid" value="sa" />
<add key="db.password" value="123" />
</databaseSettings>
</spring>
<!--Spring.NET配置 结束-->
<appSettings>
<!-- 为 OpenSessionInViewModule 的 SessionFactory 提供名字 -->
<add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="NHibernateSessionFactory" />
<!-- 数据库连接字符串,(如果采用加密方式,上面一项要设置为true;加密工具,可在官方下载,
如果使用明文这样server=127.0.0.1;database=.....,上面则设置为false。 -->
<add key="ConnectionString" value="server=192.168.40.221;database=FlowQuery;uid=sa;pwd=123" />
<!--一般文件类型-->
<add key="fileType" value="jpg|gif|bmp|jpeg|png|rar|doc|txt|xls|docx|xlsx|swf|pdf|zip|ppt|pot|wps|JPG|GIF|BMP|JPEG|PNG|RAR|DOC|TXT|XLS|DOCX|XLSX|SWF|PDF|ZIP|PPT|POT|WPS" />
<!--图片类型-->
<add key="imgType" value="jpg|gif|bmp|jpeg|png|JPG|GIF|BMP|JPEG|PNG" />
<!--导入Excel连接地址-->
<add key="excelType" value="Provider=Microsoft.Ace.OleDb.12.0;Data Source={0};Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<!-- IIS6配置 -->
<httpModules>
<!-- Spring 提供的 Module -->
<add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web" />
<!--
由 Spring 自动打开会话,必须提供一个名为 SessionFactory 的会话工厂
使用后,可以使用 SessionFactory 的 GetCurrentSession 方法获取会话
-->
<add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate4" />
</httpModules>
<httpHandlers>
<!-- Spring 提供的处理程序 -->
<add verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web" />
<!-- 取消 Spring.NET 对于 Web 服务的处理 -->
<!--<add verb="*" path="*.asmx" type="Spring.Web.Services.WebServiceHandlerFactory, Spring.Web"/>-->
<add verb="*" path="ContextMonitor.ashx" type="Spring.Web.Support.ContextMonitor, Spring.Web" />
<add verb="*" path="*.ashx" type="Spring.Web.Support.DefaultHandlerFactory, Spring.Web" />
</httpHandlers>
<!--<customErrors mode="On" defaultRedirect="/Main/Error.aspx" />-->
<!--Forms身份认证-->
<authentication mode="Forms">
<forms name="FlowQuery" path="/" loginUrl="Login.aspx" protection="All"/>
</authentication>
<!--表单验证模式为2.0,上传文件最大为10M-->
<httpRuntime requestValidationMode="2.0" maxRequestLength="102400" executionTimeout="120" />
</system.web>
<system.webServer>
<defaultDocument>
<files>
<add value="Login.aspx" />
</files>
</defaultDocument>
</system.webServer>
</configuration>
需要注意的是:databaseSettings节点配置的为之前的DAO篇讲解的数据库访问配置,key的值都是在DAO中定义好的变量,value给出具体的值就行了。
最后,把WebUI层的目录贴一下:
OK,断断续续把整个教程讲完了,很多详细的细节我这里没有讲,主要只是说了搭建一个Spring.NET+NHibernate+泛型优化的框架的过程。希望大家自己通过第一讲中提供的资料,或者其他资料来完善基础知识,达到精益求精。共勉!