MVC三层二

DAL层的封装并不是很好,有些地方还要修改,往后面我们就会发现问题。

下面就是对BLL层的封装了,同样以UserInfo要有一个BLL类UserInfoService,其他的实例也有一个Service类同样是对IDAL层的调用,又要抽象出一个基类BaseService来

 1 using DALFactory;
 2 using IDAL;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 using System.Linq.Expressions;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9
10 namespace BLL
11 {
12     public abstract class BaseService<T>where T:class,new()
13     {
14         //??怎样调用IDAL实例,基类怎么知道调用哪个DAL实例啊?
15
16         //公用的CRUD方法
17         public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLamda)
18         {
19             //return ?.LoadEntities(whereLamda);
20         }
21         public IQueryable<T> LoadPageEntities<s>(int pageSize, int pageIndex, out int totalCount, Expression<Func<T, bool>> whereLamda, Expression<Func<T, s>> orderByLamda, bool IsAsc)
22         {
23            // return ?.LoadPageEntities<s>(pageSize, pageIndex, out totalCount, whereLamda, orderByLamda, IsAsc);
24         }
25         public bool DeleteEntity(T entity)
26         {
27            //return  ?.DeleteEntity(entity);
28         }
29         public bool EditEntity(T entity)
30         {
31             //return  ?.EditEntity(entity);
32         }
33         public T AddEntity(T entity)
34         {
35             return  ?.AddEntity(entity);
36         }
37     }
38 }

代码中这个基类不知道要调用哪个DAL实例,这样就实现不了对基类的封装BaseService,我们在BaseService类中定义一个属性CurrentDAL,这个属性里面放的就是IBaseDAL<>类型,这样就可以知道是哪个DAL了,因为这个类的类型是IBaseDAL类型封装了对所有实例的方法,但是只定义没有赋值,我们要在BaseService对CurrentDAL赋值,但是BaseService确定不了到底要用哪个DAL,所以在BaseService定义一个抽象方法,把这个方法给子类实现,子类UserInfoService知道自己是对UserInfo表实现的数据操作,再把父类改为抽象类,在BaseService的构造函数里面调用一下这个方法

 1 using DALFactory;
 2 using IDAL;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 using System.Linq.Expressions;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9
10 namespace BLL
11 {
12     public abstract class BaseService<T>where T:class,new()
13     {
14         /// <summary>
15         /// 当前DAL实例字段,存储当前DAL
16         /// </summary>
17         public IBaseDAL<T> CurrentDAL{get;set;}
18         /// <summary>
19         /// 设置当前DAL实例,由子类实现
20         /// </summary>
21         /// <returns></returns>
22         public abstract void SetCurrentDAL();
23         /// <summary>
24         /// 构造方法内调用子类的SetCurrentDAL()方法,初始化CurrentDAL
25         /// </summary>
26         public BaseService()
27         {
28             SetCurrentDAL();
29         }
30         //公用的CRUD方法
31         public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLamda)
32         {
33             return CurrentDAL.LoadEntities(whereLamda);
34         }
35         public IQueryable<T> LoadPageEntities<s>(int pageSize, int pageIndex, out int totalCount, Expression<Func<T, bool>> whereLamda, Expression<Func<T, s>> orderByLamda, bool IsAsc)
36         {
37             return CurrentDAL.LoadPageEntities<s>(pageSize, pageIndex, out totalCount, whereLamda, orderByLamda, IsAsc);
38         }
39         public bool DeleteEntity(T entity)
40         {
41             CurrentDAL.DeleteEntity(entity);
42             return this.GetCurrentDbSession.SaveChanges();
43         }
44         public bool EditEntity(T entity)
45         {
46             CurrentDAL.EditEntity(entity);
47             return this.GetCurrentDbSession.SaveChanges();
48         }
49         public T AddEntity(T entity)
50         {
51             CurrentDAL.AddEntity(entity);
52             this.GetCurrentDbSession.SaveChanges();
53             return entity;
54         }
55     }
56 }

让其他要实现这些方法的类继承这个基类,实现这个基类抽象方法,BLL层就封装好了,接下来就是开放一个IBLLService的接口了,同样IUserInfoService和IUserStuService都要实现BaseService的方法,所以封装一个IBaseService接口,让IUserInfoService和其他这样的类继承这个基接口

 1 using IDAL;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Linq.Expressions;
 6 using System.Text;
 7 using System.Threading.Tasks;
 8
 9 namespace IBLL
10 {
11     public interface IBaseService<T>where T:class,new()
12     {
13         IBaseDAL<T> CurrentDAL { get; set; }
14         IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLamda);
15         IQueryable<T> LoadPageEntities<s>(int pageSize, int pageIndex, out int totalCount, Expression<Func<T, bool>> whereLamda, Expression<Func<T, s>> orderByLamda, bool IsAsc);
16         bool DeleteEntity(T entity);
17         bool EditEntity(T entity);
18         T AddEntity(T entity);
19     }
20 }

这样最外层的控制器里就使用IUserInfoService接口,让BLL层和控制器层解耦……

BLL层也带了个爹IBLL层……

时间: 2024-08-09 06:24:21

MVC三层二的相关文章

ioc初步理解(二) 简单实用autofac搭建mvc三层+automapper=》ioc(codeFirst)

之前在园子闲逛的时候,发现许多关于automapper的文章,以及用aotufac+automapper合在一起用.当然发现大多数文章是将automapper的特点说出或将automapper几处关键代码放出.当然有过基础的人看这种文章没有什么问题,但是对于完全没有基础的小白来看完全是灾难级别的(我就是),经常按着博文一点一点的写,突然发现少了一部分导致代码无法运行.在搜索各种文章之后,终于用自己的理解写出了一个简单的运用automapper的demo,日后待我对automapper理解加深会进

Angular JS从入门基础 mvc三层架构 常用指令

Angular JS从入门基础  mvc模型 常用指令 ★ 最近一直在复习AngularJS,它是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核心的是:MVC.模块化.自动化双向数据绑定.语义化标签.依赖注入等等. 1.常用指令 AngularJS 通过指令扩展了HTML,且通过表达式绑定数据到 HTML.下面我们看一下AngularJS中的常用指令. (1).基本概念 指令:AngularJS中,通过扩展HTML的属性提供功能.所以,ng-

★★JSP+Struts+Mysql构建的MVC三层框架对一张数据表的CURD

项目实现流程 大体流程:搭建环境 à 开发后台 à 开发前台 建立工程(struts2CURD),拷贝jar包,建立struts.xml文件,搭建环境 建立数据库和数据源配置:dbcpconfig.properties 建立db.sql:里面全是数据库操作的一些语句 建立操作数据库的工具:*.util:DBCPUtil.java,用于加载数据源.getDataSource(); *.Domain:User.java 继承ActionSupport,实现Serializable接口. ????写好

ASP.NET MVC 视图(二)

ASP.NET MVC 视图(二) 前言 上篇中对于视图引擎只是做了简单的演示,对于真正的理解视图引擎的工作过程可能还有点模糊,本篇将会对由MVC框架提供给我们的Razor视图引擎的整个执行过程做一个粗略的讲解,目的在于让大家对Razor视图引擎的执行过程留个印象以便联想的思考到视图引擎的作用以及视图在MVC框架中的表示. ASP.NET MVC 视图 自定义视图引擎 Razor视图引擎执行过程 Razor视图的依赖注入.自定义视图辅助器 分段.分部视图的使用 Razor语法.视图辅助器 Raz

ASP.NET MVC路由(二)

 ASP.NET MVC路由(二) 前言 在上一篇中,提及了Route.RouteCollection对象的一些信息,以及它们的结构所对应的关系.按照处理流程走下来还有遗留的疑问没有解决这个篇幅就来讲解一下. URL规则的生成 Url规则看名字挺吓唬人的,其实就是根据我们自定义的Url来解析出一个模式,然后等待请求的Url来的时候,跟我们定义的模式进行匹配(如下图).这是后续的内容. 在上篇中说到URL规则的定义是在Route对象中的,下面来讲解在Route对象中怎么根据用户注册的URL转变成U

spring mvc(二)开发环境搭建和HelloWorld程序

Spring MVC3在controller和视图之间传递参数的方法: 一, 从controller往视图传递值, controller---->视图 1)简单类型,如int, String,直接写在controller方法的参数里,是无法传递到视图页面上的(经测试). (而用@RequestParam("name")注解,可以从视图上,或地址中加?name=***传递到controller方法里) 2)可以用Map<String, Object>,其键值可以在页面上

004. Asp.Net Routing与MVC 之二: 请求如何激活Controller和Action

上篇讲到 请求到达 MvcRouteHandler ,并且透过 IRouteHandler.GetHttpHandler 获取到了真正的处理程序 MvcHandler 这次我们看看,MvcHandler是如何依据请求,来激活对应的controller和Action来处理请求的. 一.先看看MvcHandler 的核心内容 1: public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState 2: {

ASP.NET MVC 控制器(二)

ASP.NET MVC 控制器激活(二) 前言 在之前的篇幅中,用文字和图像来表示了控制器的激活过程,描述的角度都是从框架默认实现的角度去进行描述的,这样也使得大家都可以清楚的知道激活的过程以及其中涉及到的对象模型,今天的篇幅就是在激活的过程中,框架提供了哪些可注入点,站在一个使用者的角度来进行描述. 激活控制器-注入点入口 如上图,这是上个篇幅中描述的控制器激活过程图,这里引用过来是怕有的朋友忘记了前面的所说和没看过前面篇幅的朋友. 就从默认控制器工厂的实现来看,在CreateControll

[转]深入ASP.NET MVC之二:路由模块如何工作

本文转自:http://www.cnblogs.com/yinzixin/archive/2012/11/05/2754483.html 摘要: 上文分析了UrlRouting模块何时会被触发,本文重点分析路由模块是如何工作,以及如何利用路由模块实现Area. 先看路由模块的PostResolveRequestCache事件中被触发的方法: public virtual void PostResolveRequestCache(HttpContextBase context) { RouteDa