一、前言:
Spring.Net是Java開源框架遷移過來的,主要分為
1)依賴注入
2)面向方面編程
3)數據訪問抽象
4)Asp.Net擴展
四個模塊功能,這里只是簡單介紹依賴注入模塊功能。
對於Mybatis,在這里也是簡單介紹相關配置和實現插入和查找功能。
二、項目結構:
DAL\BLL\Web項目在這里不作介紹,因為本文章重點不在這里。
這里着重介紹下Spring.Net和MyBatis的東西。開始開發前,請先下載先關要引用的組件,具體下載和要引用什么組件推薦上官網了解和下載,這里不再詳細贅述。
其他文件說明:
1、Res文件夾下BLLObjects.xml等文件:Spring.net框架定義依賴注入的類定義和屬性。
2、Web根目錄下的Webconfig定義一些Spring.net的基礎配置和資源文件存放位置。
三、具體開發
1、Spring.Net模塊介紹
這里以BLL層的Web層為例作介紹,其他層也是類似,讀者可以舉一反三。
關於Spring.Net框架的WebConfig配置如下:
1)注冊Spring.Net庫的dll:
1 <!--Spring.Net配置 引用Spring需要使用的類型--> 2 <configuration> 3 <configSections> 4 <sectionGroup name="spring"> 5 <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" /> 6 <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> 7 </sectionGroup> 8 </configSections>
2)添加對aspx頁面注入支持:
在webconfig根節點的config節點下面的configuration的System.Web(如果沒有此節點請自行添加)節點下配置如下。這個配置也是必要的,作用是添加對aspx頁面注入的支持。
1 <httpHandlers> 2 <remove verb="*" path="*.asmx" /> 3 <add verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web" /> 4 </httpHandlers> 5 <httpModules> 6 <!--這里不能漏,不然頁面注入的時候會出錯--> 7 <add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/> 8 9 </httpModules> 10 11
3)引入類型定義文件:
Webconfig xml根節點下配置引入定義對象的資源文件。引入資源文件分為兩種方式,一種是作為資源嵌入到程序集中,如下面注釋代碼所示,uri="assembly://MyBlog.BLL/MyBlog.BLL/Objects.xml"/>。用這種方式要在Visual Studio資源管理器中將Objects.xml文件的生成操作屬性改成嵌入的資源,不然是沒把文件帶進去的。這里推薦第二中方式,即本項目使用的方式,
直接使用相對路徑描述資源。如:<resource uri="~/Res/Objects/BLLObjects.xml"/>。符號"~"代表根目錄。
1 <spring> 2 <context> 3 <!--assembly://程序集名/命名空名/文件名(程序集內嵌資源)--> 4 <!--<resource uri="assembly://MyBlog.BLL/MyBlog.BLL/Objects.xml"/>--> 5 <resource uri="config://spring/objects" /> 6 <resource uri="~/Res/Objects/TestObjects.xml"/> 7 <!--數據庫連接對象--> 8 <resource uri="~/Res/Objects/DBConfig.xml"/> 9 <resource uri="~/Res/Objects/BLLObjects.xml"/> 10 <resource uri="~/Res/Objects/DALObjects.xml"/> 11 </context> 12 <!--必要--> 13 <objects xmlns="http://www.springframework.net"> 14 </objects> 15 </spring>
4)類型定義配置:
BLLObjects.xml文件里面的內容如下所示。諸如此類的文件作用是定義類型,這個是Spring.Net注入的關鍵。這里解釋一下下面配置文件的意思。
每一個object節點,描述了C#代碼中的一個類,object節點的id是個身份標記,這個必須是唯一的;type屬性描述了具體的類,這個屬性由類的全名+逗號+類的命名空間構成。
例如type="MyBlog.BLL.ArtiCaManager,MyBlog.BLL"。這里描述的是BLL層中的ArtiCaManager類。而object節點下面的property 屬性則是描述了這個類下面的屬性,這是本項目依賴注入的關鍵(本項目采用的注入方式只要是屬性注入和構造注入)。例如節點 :
<property name="ArtiCaDao" ref="ArtiCaDao"></property> 。
這個是ArtiCaManager類下面的屬性:
public IArtiCaDao ArtiCaDao { get; set; } //文章類別數據操作類。
這個屬性節點的作用是描述了IArtiCaDao接口實例化的類型是ArtiCaDao(ref="ArtiCaDao">)。而ref屬性里面寫的是object節點的ID,作用也是描述了一個類型。
1 <?xml version="1.0" encoding="utf-8" ?> 2 3 <objects xmlns="http://www.springframework.net" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.net 6 http://www.springframework.net/xsd/spring-objects.xsd"> 7 <!--類型的全名,然后是一個逗號,最后是類型所在的程序集名稱--> 8 <!--<object id="ArtiCaMana" type="MyBlog.BLL.ArtiCaManager, MyBlog.BLL" />--> 9 10 <object id="ArtiCaMana" type="MyBlog.BLL.ArtiCaManager,MyBlog.BLL"> 11 <property name="ArtiCaDao" ref="ArtiCaDao"></property> 12 </object> 13 14 <object id="LogMana" type="MyBlog.BLL.LogManager,MyBlog.BLL"> 15 <property name="iLogDao" ref="LogDao"></property> 16 </object> 17 18 <object id="DeptMana" type="MyBlog.BLL.DepartmentManager,MyBlog.BLL"> 19 <property name="iDepartmentDao" ref="DepartmentDao"></property> 20 </object> 21 22 </objects>
5)代碼實現:
BLL層ArtiCaManager類代碼
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MyBlog.Model; using MyBlog.IDAL; using Spring.Context; using Spring.Context.Support; using MyBlog.IBLL; namespace MyBlog.BLL { /// <summary> /// 文章類別管理業務邏輯類 /// </summary> public class ArtiCaManager : IArtiCaManager { public IArtiCaDao ArtiCaDao { get; set; } //文章類別數據操作類 /// <summary> /// 插入文章類別 /// </summary> /// <param name="arCa">文章類別實體類</param> /// <returns>是否插入成功</returns> public bool InsertCa(ArticleCategory arCa) { arCa.CategoryName = arCa.CategoryName+ "[這里是調用了文章類別管理類BLL接口插入的]"; //僅供測試留個記號 return ArtiCaDao.InsertCa(arCa); } /// <summary> /// 取出所有文章類別 /// </summary> /// <returns>文章類別列表</returns> public IList<ArticleCategory> SelectAllCa() { return ArtiCaDao.SelectAllCa(); } } }
四、結論
Spiring.Net的依賴注入,主要是利用了.Net反射的特性,在xml中定義了.Net中某個對象的類型,然后框架自動實例化,好處在於提高軟件的靈活性,特別是對於一個接口有多個實現的場景。