摘要:上篇写了如何搭建一个简单项目框架的上部分,讲了关于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
如有谬误,欢迎指正!