摘要:上篇寫瞭如何搭建一個簡單項目框架的上部分,講了關於Dal和Bll之間解耦的相關知識,這篇來把後i面的部分說一說。 上篇講到DbSession,現在接著往下講。 首先,還是把一些類似的操作完善一下,與Dal層相同,我們同樣可以把Bll層中某些使用廣泛的類似的操作封裝到基類中,另外,同樣要給Bll ...
摘要:上篇寫瞭如何搭建一個簡單項目框架的上部分,講了關於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:[email protected]
如有謬誤,歡迎指正!