摘要:上篇寫了如何搭建一個簡單項目框架的上部分,講了關於Dal和Bll之間解耦的相關知識,這篇來把后i面的部分說一說。
上篇講到DbSession,現在接着往下講。
首先,還是把一些類似的操作完善一下,與Dal層相同,我們同樣可以把Bll層中某些使用廣泛的類似的操作封裝到基類中,另外,同樣要給Bll層添加接口層。
下面直接給出相應的代碼:
Bll層基類:
BaseService.cs
1 public abstract class BaseService<T> where T : class,new() 2 { 3 public IBaseDal<T> CurrentDal { get; set; } 4
5 public IDbSession DbSession 6 { 7 get
8 { 9 return DbSessionFactory.GetCurrentDbSession(); 10 } 11 } 12
13 public BaseService() 14 { 15 SetCurrentDal(); 16 } 17
18 public abstract void SetCurrentDal();//抽象方法:要求子類必須實現。
19
20 public IQueryable<T> GetEntityByLambda(Expression<Func<T,bool>> wherelambda) 21 { 22 return CurrentDal.GetEntityByLambda(wherelambda); 23 } 24
25
26 public T AddEntity(T entity) 27 { 28 CurrentDal.AddEntity(entity); 29 DbSession.SaveChanges(); 30 return entity; 31 } 32
33 //刪除
34
35 public bool DeleteEntity(T entity) 36 { 37 CurrentDal.DeleteEntity(entity); 38 return DbSession.SaveChanges() > 0; 39
40 } 41 // 改
42 public bool UpdateEntity(T entity) 43 { 44 CurrentDal.UpdateEntity(entity); 45 return DbSession.SaveChanges() > 0; 46
47 } 48 }
IBaseService.cs
1 public interface IBaseService<T> where T : class,new() 2 { 3 IQueryable<T> GetEntityByLambda(Expression<Func<T, bool>> wherelambda); 4 T AddEntity(T entity); 5 bool DeleteEntity(T entity); 6 bool UpdateEntity(T entity); 7 }
IUserService.cs
1 public interface IUserService:IBaseService<Users>
2 { 3
4 }
UserService.cs
1 public class UserService:BaseService<Users>,IUserService 2 { 3
4 //IUserDal userDal = AbstractFactory.GetUserDal(); 5 //IDbSession dbSession = DbSessionFactory.GetCurrentDbSession(); 6 //public Users AddUser(Users user) 7 //{ 8 // dbSession.UserDal.AddEntity(user); 9 // dbSession.SaveChanges(); 10 // return user; 11 //} 12
13 //public IQueryable<Users> GetUserByLambda(Expression<Func<Users,bool>> wherelambada) 14 //{ 15 // return dbSession.UserDal.GetEntityByLambda(wherelambada); 16 //} 17
18 //public bool DeleteUser(Users user) 19 //{ 20 // dbSession.UserDal.DeleteEntity(user); 21 // return dbSession.SaveChanges() > 0; 22 //} 23
24 //public bool UpdateUser(Users user) 25 //{ 26 // dbSession.UserDal.UpdateEntity(user); 27 // return dbSession.SaveChanges() > 0; 28 //} 29
30 //給父類的屬性賦值
31 public override void SetCurrentDal() 32 { 33 CurrentDal = this.DbSession.UserDal; 34 } 35 }
以上就是對Bll層的一些封裝和接口層的構建,現在在現有的代碼基礎上,我們來看一下,控制器對Bll層的常規調用:
下面給一段簡短代碼:
HomeController => AddUser方法
1 public ActionResult AddUser(FormCollection form) 2 { 3 Users user = new Users();
//重點看這句,對Bll層的調用 4 IUserService userService = new UserService(); 5 user.UserName = form["name"]; 6 user.PassWord = form["pwd"]; 7 user.PhoneNumber = form["phone"]; 8 user.EMail = form["email"]; 9 userService.AddEntity(user); 10 if (user == null) 11 { 12 return View("Contact"); 13 } 14 else
15 { 16 return View("About"); 17 } 18 }
這是一段向數據庫中添加user信息的代碼,前端代碼省略了。
從這段代碼里我們可以看到,這里Bll層和UI等的耦合度仍然非常的高,
IUserService userService = new UserService();
這一句跟前面講的Bll層調Dal層一樣,耦合度很高,那么如何降低這個耦合度呢,再次使用工廠的方法嗎,不不不,那好像太麻煩了。
這里就要用到一個新的知識點了———— spring.net (據說這個很牛逼,但我也不咋清楚,只能邊學邊寫了)。
接下來說一下spring.net的使用方法和步驟:
1.在web.config中添加Spring.Net塊配置和Spring.Net容器配置節點
塊配置節點:
1 <!--Spring.Net塊配置-->
2 <sectionGroup name="spring">
3 <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc4"/>
4 </sectionGroup>
容器配置節點
1 <!--Spring.Net 的容器的配置節點-->
2 <spring>
3 <context>
4 <resource uri="file://~/Config/controllers.xml"/>
5 </context>
6 </spring>
2.添加相關引用
首先,在程序目錄下的package文件夾新建 Spring.Net文件夾,然后導入如下文件:
導入如下文件:
在Ui項目下添加引用:
3.更改global.aspx.cs文件
將 MvcApplication 由繼承 System.Web.HttpApplication 改為 Sring.Web.Mvc.SpringMvcApplication .
4.在UI項目下新建Config文件夾,在文件夾中新建如下兩個配置文件:controller.xml 和 services.xml
controller.xml文件代碼如下:
1 <?xml version="1.0" encoding="utf-8" ?>
2 <objects xmlns="http://www.springframework.net">
3
4 <!--<object></object>引用了幾個Service就寫幾個Service,此處只引用一個Service,所以只寫一個-->
5 <!--type ="類的全名(命名空間名+類名),程序集名稱"-->
6 <object type="IotPf.UI.Controllers.HomeController,IotPf.UI" singleton="false" >
7 <property name="UserService" ref="UserService" />
8
9 </object>
10 </objects>
services.xml文件代碼如下:
1 <?xml version="1.0" encoding="utf-8" ?>
2 <objects xmlns="http://www.springframework.net">
3
4 <object name="UserService" type=" IotPf.Bll.UserService,IotPf.Bll" singleton="false" >
5 </object>
6
7 </objects>
注意:在web.config中記得將services.xml的引用添加進來,並且要注意順序,先services.xml,后controller.xml
5. 然后我們回到HomeController中來:在其中添加屬性userService
然后執行程序,發現會報如下錯誤:
此時,我們添加如下引用:
microsoft.aspnet.webapi
然后,再次執行程序:
運行結果無誤:
這就是Spring.Net的使用步驟了。
通過使用Spring.Net,也達到了使UI層和Bll層解耦的目的,而且操作較之工廠的操作簡單的多。
好了,一個簡單框架的第二部分,UI層和Bll層的解耦也完成了,關於框架搭建的這篇博客就寫到這里啦。
我的email:3074596466@qq.com
如有謬誤,歡迎指正!