第一次写博客,想了半天先从简单的三层架构开始吧,希望能帮助到你!

简单介绍一下三层架构, 三层架构从上到下分:表现层(UI),业务逻辑层(BLL),数据访问层(DAL)再加上数据模型(Model),用ef访问数据库,Model也就是与数据库表映射的实体。废话少说,上代码。

  • Model层

为方便说明,新建一个实体模型UserInfo,数据库表中应该对应一个UserInfo表,至于怎样建立表,有多种方式,用ef来建立表比较方便。具体怎样用ef访问数据库,后续会在其他文章中解释,敬请关注。

  1. public class UserInfo
  2. {
  3. public int Id { get; set; }
  4. public string Name { get; set; }
  5. public short Age { get; set; }
  6. }
  • DAL层

首先设计通用的CRUD基接口IBaseDal,作为通用的数据库访问通道。

  1. public interface IBaseDal<T> where T : class,new()
  2. {
  3. void Add(T entity);
  4. void Delete(T entity);
  5. void Update(T entity);
  6. IQueryable<T> GetEntities(Expression<Func<T, bool>> expression);
  7. IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression);
  8. bool SaveChanges();
  9. }

以UserInfo实体为例,继承IBaseDal接口

  1. public interface IUserInfoDal : IBaseDal<UserInfo>
  2. {
  3.  
  4. }

接口设计完成,设计通用基类,这里存在变化点,本例用ef实现,如果以后通过其他实体框架或者直接通过ado.net访问数据库,只需要改动这个类。

  1. public class BaseDal<T> where T : class,new()
  2. {
  3. private DbContext dbContext = DbContextFactory.DbContext;
  4.  
  5. public void Add(T entity)
  6. {
  7. dbContext.Set<T>().Add(entity);
  8. }
  9.  
  10. public void Delete(T entity)
  11. {
  12. dbContext.Entry(entity).State = EntityState.Deleted;
  13. }
  14.  
  15. public void Update(T entity)
  16. {
  17. dbContext.Entry(entity).State = EntityState.Modified;
  18. }
  19.  
  20. public IQueryable<T> GetEntities(Expression<Func<T, bool>> expression)
  21. {
  22. return dbContext.Set<T>().Where(expression);
  23. }
  24.  
  25. public IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression)
  26. {
  27. if (isAsc) //升序
  28. {
  29. return dbContext.Set<T>().Where(expression).OrderBy(keySelector).Skip((pageIndex - ) * pageSize).Take(pageSize);
  30. }
  31. else //降序
  32. {
  33. return dbContext.Set<T>().Where(expression).OrderByDescending(keySelector).Skip((pageIndex - ) * pageSize).Take(pageSize);
  34. }
  35. }
  36.  
  37. public bool SaveChanges()
  38. {
  39. return dbContext.SaveChanges() > ;
  40. }
  41. }
  1. public static class DbContextFactory
  2. {
  3. public static DbContext DbContext
  4. {
  5. get
  6. {
  7. DbContext dbContext = CallContext.GetData("DbContext") as DbContext;
  8. if (dbContext == null)
  9. {
  10. dbContext = new ModelContainer();
  11. CallContext.SetData("DbContext", dbContext);
  12. }
  13. return dbContext;
  14. }
  15. }
  16. }

接下来实现具体的实体数据访问层,以UserInfoDal为例,其余类似。

  1. public class UserInfoDal : BaseDal<UserInfo>, IUserInfoDal
  2. {
  3.  
  4. }
  • BLL层

首先像DAL层一样,定义通用接口。

  1. public interface IBaseService<T> where T : class,new()
  2. {
  3. void Add(T entity);
  4. void Delete(T entity);
  5. void Update(T entity);
  6. IQueryable<T> GetEntities(Expression<Func<T, bool>> expression);
  7. IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression);
  8. bool SaveChanges();
  9. }

通用基类,注意通用基类不需要实现上面的接口

  1. public class BaseService<T> where T : class,new()
  2. {
  3. private BaseDal<T> baseDal = new BaseDal<T>();
  4.  
  5. public void Add(T entity)
  6. {
  7. baseDal.Add(entity);
  8. }
  9.  
  10. public void Delete(T entity)
  11. {
  12. baseDal.Delete(entity);
  13. }
  14.  
  15. public void Update(T entity)
  16. {
  17. baseDal.Update(entity);
  18. }
  19.  
  20. public IQueryable<T> GetEntities(Expression<Func<T, bool>> expression)
  21. {
  22. return baseDal.GetEntities(expression);
  23. }
  24.  
  25. public IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression)
  26. {
  27. return baseDal.GetEntitiesByPage(pageSize, pageIndex, isAsc, keySelector, expression);
  28. }
  29.  
  30. public bool SaveChanges()
  31. {
  32. return baseDal.SaveChanges();
  33. }
  34. }

接下来是UserInfoService

  1. public class UserInfoService : BaseService<UserInfo>, IBaseService<UserInfo>
  2. {
  3.  
  4. }

至此,所有底层代码完成,顶层的UI层调用不在赘述了,这里附上源码下载地址

链接:https://pan.baidu.com/s/1itW5XKBYB1onkQDfuwJvMw
提取码:ye0n

说明:源码中Model层中采用的ef的Model First方式创建数据库,下载以后不能直接运行,可以将Model程序集中的Model.edmx.sql在sqlserver创建数据库,以DataBase First方式重新创建Model程序集,可以正常运行。

三层架构搭建(asp.net mvc + ef)的更多相关文章

  1. 搭建三层架构(ASP.NET MVC+EF)

    昨天面试的时候最后做了一道上机题,竟然跪了,跪就跪在没有搭好框架,连接数据库总是程序报错. 回来之后亲自搭了一下框架,弄好后放到博客上.下图就是搭建好后,整个框架的结构就是这样,下面对框架中的文件进行 ...

  2. 转载——Asp.Net MVC+EF+三层架构的完整搭建过程

    转载http://www.cnblogs.com/zzqvq/p/5816091.html Asp.Net MVC+EF+三层架构的完整搭建过程 架构图: 使用的数据库: 一张公司的员工信息表,测试数 ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) 前言:这篇博客开始我们便一步一步的来实现这 ...

  4. MVC三层架构搭建

    MVC三层架构搭建 项目主要是用三层来搭建项目,三层分为表现层,数据层和业务层.项目用了目前比较流行的IOC架构.目前流行的IoC 框架有AutoFac,Unity,Spring.NET等,项目中选用 ...

  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...

  6. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2 ...

  7. 搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi

    里我们用三层架构搭建一个连接MySql的ASP.netCore模板的WebApi项目 首先添加WebApi项目(ASP.NetCore版本) 右键解决方案>新建项目> 选择Web>A ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)  (1)框架搭建    (2):数据 ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

随机推荐

  1. CSS样式之a标签(原文网址http://www.divcss5.com/shili/s57.shtml)

    这是个人在做网站的时候整理的关于a标签的使用方法,整理一下,方便下次使用. 一.a超链接的代码 <a href="http://www.baidu.com" target=& ...

  2. ios 下拉列表

    #import <UIKit/UIKit.h> @class FVPullDownMenu; /** 指示器状态*/ typedef enum { IndicatorStateShow = ...

  3. 如何在首次启动 Linux 虚拟机时对其进行自定义

    在前面的教程中,你已学习如何通过 SSH 连接到虚拟机 (VM) 并手动安装 NGINX. 若要以快速一致的方式创建 VM,通常需要某种形式的自动化. 在首次启动 VM 时实现自定义的常见方法是使用  ...

  4. 关于Entity Framework关系配置,提示列名XXXX_Id无效的问题

    问题描述 : 数据库中有两张表,如下: Member(会员)表有外键RoleId,对应的是Role(角色)表的主键Id,业务逻辑是Member表的RoleId必须与Role表的Id对应(但在设计数据表 ...

  5. [翻译] About Core Image

    About Core Image Core Image is an image processing and analysis technology designed to provide near ...

  6. [翻译] OrigamiEngine

    OrigamiEngine https://github.com/ap4y/OrigamiEngine Lightweight iOS and OSX audio engine with opus, ...

  7. Error creating bean with name xxxx,xxxx must be provided

    原因: 继承父类的bean注入是set,get方法 问题: 自己的controller不能创建,因为需要的bean没有创建 解决方法: bean 注入,通过构造函数调用父类的set方法

  8. 【php】页面加载优化的14条原则

      1. 尽可能的减少 HTTP 的请求数 [content] 2. 使用 CDN(Content Delivery Network) [server] 3. 添加 Expires 头(或者 Cach ...

  9. spring4声明式事务--01注解方式

    1.在spring配置文件中引入 tx 命名空间 xmlns:tx="http://www.springframework.org/schema/tx" 2.配置事务管理器 < ...

  10. (1)构造方法和方法重载 (2)this关键字 (3)方法的传参和递归调用

    1.构造方法和方法重载如: Person p = new Person(); - 声明Person类型的引用p指向Person类型的对象 p.show(); - 调用名字为show()的成员方法 1. ...