前面的章節講解了搭建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+泛型優化的框架的過程。希望大家自己通過第一講中提供的資料,或者其他資料來完善基礎知識,達到精益求精。共勉!