標籤:
這篇寫一寫如何使用Spring.net來解耦各個項目
1. 在介面層添加IStudentBLL檔案,裡面有GetStudent和GetAllStudents兩個方法;然後在StudentBLL類裡實現這兩個方法。此外還要在StudentManageSystem.ViewModel層添加StudentViewModel。
注意,此處使用了屬性StudentRepository,後期會用Spring.net將些屬性注入
2. 添加單元測試工作,為BLL層寫單元測試。此處引用了NSubstitute做為Mock工具,為BLL層隔離Repository層。具體的使用方法,可自行百度,此處不做解釋。
3. 引用Spring.net裡面的Spring.Core,為了能夠實現注入,需要重新實現IControllerFactory介面,如下
public class SpringControllerFactory : IControllerFactory { /// <summary> /// Default ControllerFactory /// </summary> private static DefaultControllerFactory defalutf = null; public IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) { //get spring context //WebApplicationContext ctx = ContextRegistry.GetContext() as WebApplicationContext; var ctx = ContextRegistry.GetContext(); string controller = controllerName + "Controller"; //尋找是否配置該Controller if (ctx.ContainsObject(controller)) { object controllerf = ctx.GetObject(controller); return (IController)controllerf; } else { if (defalutf == null) { defalutf = new DefaultControllerFactory(); } return defalutf.CreateController(requestContext, controllerName); } } public void ReleaseController(IController controller) { //get spring context IApplicationContext ctx = ContextRegistry.GetContext(); if (!ctx.ContainsObject(controller.GetType().Name)) { if (defalutf == null) { defalutf = new DefaultControllerFactory(); } defalutf.ReleaseController(controller); } } public System.Web.SessionState.SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName) { return SessionStateBehavior.Default; } }
View Code
在Global.cs的Application_Start方法中設定控制器工廠,如下
4. 在web.config中配置Spring.net檔案
首先在configSections裡加入節點<sectionGroup>,內容如下,這個節點必須是排在第一位的
然後在與configSections並列的層級添加spring context,可以使用外部檔案(1),也可以使用內容節點(2)方式,我這裡是把配置節點放到了App_Data裡面了
objects檔案內容如下
<?xml version="1.0" encoding="utf-8" ?><objects xmlns="http://www.springframework.net"> <object id="HomeController" type="StudentManageSystem.Web.Controllers.HomeController, StudentManageSystem.Web" singleton="false"> <property name="StudentBll" ref="studentBll"></property> </object> <object id="studentBll" type="StudentManageSystem.Business.StudentBLL, StudentManageSystem.Business" scope="request"> <property name="StudentRepository" ref="studentRepository"/> </object> <!-- repository --> <object name="smsDbContext" type="StudentManageSystem.Repository.SMSContext,StudentManageSystem.Repository" scope="request"> <constructor-arg name="connectionStringOrName" value="SMSContext"> </constructor-arg> </object> <object id="repositoryBase" abstract="true" scope="request"> <constructor-arg ref="smsDbContext"/> </object> <object name="studentRepository" type="StudentManageSystem.Repository.StudentRepository,StudentManageSystem.Repository" parent="repositoryBase" scope="request"/> <object name="scoreRepository" type="StudentManageSystem.Repository.ScoreRepository,StudentManageSystem.Repository" parent="repositoryBase" scope="request"/> <object name="gradeRepository" type="StudentManageSystem.Repository.GradeRepository,StudentManageSystem.Repository" parent="repositoryBase" scope="request"/> <object name="subjectRepository" type="StudentManageSystem.Repository.SubjectRepository,StudentManageSystem.Repository" parent="repositoryBase" scope="request"/></objects>
View Code
5. 在Web層Views/Home添加Student視圖,然後在HomeController裡添加對應的action。同樣也加入StudentBll屬性,為注入做準備
做好準備之後,F5運行,見證奇蹟的時刻到了……
呵呵,報錯了,看看什麼原因?是spring沒有找到StudentRepository類庫,無法執行個體化。將StudentManageSystem.Repository項目的產生路徑改到StudentManageSystem.Web/bin目錄下,重新F5運行起來~~~
產生成功,StudentBll已經注入成功,並且能從資料庫裡取出內容,如下。
好了,就到這裡吧,拋個磚,希望能引出玉來,哈哈~~~裡面有些說明不清楚的地方請大家包涵,歡迎討論。
代碼:http://pan.baidu.com/s/1o6Lu6Fo
PS:硬廣,本人正準備換工作,如果有親需要MVC方面的人,可以聯絡我。
簡介:8年以前.net BS開發經驗,MVC4年+,WCF2年+,jQuery6年+;3年以上管理經驗,帶過10人左右的團隊;對品質有較高的要求。地點:北京
連絡方式:junior_ya@163.com,或者回複連絡方式,我給您發簡曆,謝謝大家。
Asp.net MVC + EF + Spring.Net 項目實踐(四)