三层架构搭建(asp.net mvc + ef)
第一次写博客,想了半天先从简单的三层架构开始吧,希望能帮助到你!
简单介绍一下三层架构, 三层架构从上到下分:表现层(UI),业务逻辑层(BLL),数据访问层(DAL)再加上数据模型(Model),用ef访问数据库,Model也就是与数据库表映射的实体。废话少说,上代码。
- Model层
为方便说明,新建一个实体模型UserInfo,数据库表中应该对应一个UserInfo表,至于怎样建立表,有多种方式,用ef来建立表比较方便。具体怎样用ef访问数据库,后续会在其他文章中解释,敬请关注。
- public class UserInfo
- {
- public int Id { get; set; }
- public string Name { get; set; }
- public short Age { get; set; }
- }
- DAL层
首先设计通用的CRUD基接口IBaseDal,作为通用的数据库访问通道。
- public interface IBaseDal<T> where T : class,new()
- {
- void Add(T entity);
- void Delete(T entity);
- void Update(T entity);
- IQueryable<T> GetEntities(Expression<Func<T, bool>> expression);
- IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression);
- bool SaveChanges();
- }
以UserInfo实体为例,继承IBaseDal接口
- public interface IUserInfoDal : IBaseDal<UserInfo>
- {
- }
接口设计完成,设计通用基类,这里存在变化点,本例用ef实现,如果以后通过其他实体框架或者直接通过ado.net访问数据库,只需要改动这个类。
- public class BaseDal<T> where T : class,new()
- {
- private DbContext dbContext = DbContextFactory.DbContext;
- public void Add(T entity)
- {
- dbContext.Set<T>().Add(entity);
- }
- public void Delete(T entity)
- {
- dbContext.Entry(entity).State = EntityState.Deleted;
- }
- public void Update(T entity)
- {
- dbContext.Entry(entity).State = EntityState.Modified;
- }
- public IQueryable<T> GetEntities(Expression<Func<T, bool>> expression)
- {
- return dbContext.Set<T>().Where(expression);
- }
- public IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression)
- {
- if (isAsc) //升序
- {
- return dbContext.Set<T>().Where(expression).OrderBy(keySelector).Skip((pageIndex - ) * pageSize).Take(pageSize);
- }
- else //降序
- {
- return dbContext.Set<T>().Where(expression).OrderByDescending(keySelector).Skip((pageIndex - ) * pageSize).Take(pageSize);
- }
- }
- public bool SaveChanges()
- {
- return dbContext.SaveChanges() > ;
- }
- }
- public static class DbContextFactory
- {
- public static DbContext DbContext
- {
- get
- {
- DbContext dbContext = CallContext.GetData("DbContext") as DbContext;
- if (dbContext == null)
- {
- dbContext = new ModelContainer();
- CallContext.SetData("DbContext", dbContext);
- }
- return dbContext;
- }
- }
- }
接下来实现具体的实体数据访问层,以UserInfoDal为例,其余类似。
- public class UserInfoDal : BaseDal<UserInfo>, IUserInfoDal
- {
- }
- BLL层
首先像DAL层一样,定义通用接口。
- public interface IBaseService<T> where T : class,new()
- {
- void Add(T entity);
- void Delete(T entity);
- void Update(T entity);
- IQueryable<T> GetEntities(Expression<Func<T, bool>> expression);
- IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression);
- bool SaveChanges();
- }
通用基类,注意通用基类不需要实现上面的接口
- public class BaseService<T> where T : class,new()
- {
- private BaseDal<T> baseDal = new BaseDal<T>();
- public void Add(T entity)
- {
- baseDal.Add(entity);
- }
- public void Delete(T entity)
- {
- baseDal.Delete(entity);
- }
- public void Update(T entity)
- {
- baseDal.Update(entity);
- }
- public IQueryable<T> GetEntities(Expression<Func<T, bool>> expression)
- {
- return baseDal.GetEntities(expression);
- }
- public IQueryable<T> GetEntitiesByPage<TKey>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, TKey>> keySelector, Expression<Func<T, bool>> expression)
- {
- return baseDal.GetEntitiesByPage(pageSize, pageIndex, isAsc, keySelector, expression);
- }
- public bool SaveChanges()
- {
- return baseDal.SaveChanges();
- }
- }
接下来是UserInfoService
- public class UserInfoService : BaseService<UserInfo>, IBaseService<UserInfo>
- {
- }
至此,所有底层代码完成,顶层的UI层调用不在赘述了,这里附上源码下载地址
链接:https://pan.baidu.com/s/1itW5XKBYB1onkQDfuwJvMw
提取码:ye0n
说明:源码中Model层中采用的ef的Model First方式创建数据库,下载以后不能直接运行,可以将Model程序集中的Model.edmx.sql在sqlserver创建数据库,以DataBase First方式重新创建Model程序集,可以正常运行。
三层架构搭建(asp.net mvc + ef)的更多相关文章
- 搭建三层架构(ASP.NET MVC+EF)
昨天面试的时候最后做了一道上机题,竟然跪了,跪就跪在没有搭好框架,连接数据库总是程序报错. 回来之后亲自搭了一下框架,弄好后放到博客上.下图就是搭建好后,整个框架的结构就是这样,下面对框架中的文件进行 ...
- 转载——Asp.Net MVC+EF+三层架构的完整搭建过程
转载http://www.cnblogs.com/zzqvq/p/5816091.html Asp.Net MVC+EF+三层架构的完整搭建过程 架构图: 使用的数据库: 一张公司的员工信息表,测试数 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) 前言:这篇博客开始我们便一步一步的来实现这 ...
- MVC三层架构搭建
MVC三层架构搭建 项目主要是用三层来搭建项目,三层分为表现层,数据层和业务层.项目用了目前比较流行的IOC架构.目前流行的IoC 框架有AutoFac,Unity,Spring.NET等,项目中选用 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2 ...
- 搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi
里我们用三层架构搭建一个连接MySql的ASP.netCore模板的WebApi项目 首先添加WebApi项目(ASP.NetCore版本) 右键解决方案>新建项目> 选择Web>A ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 (2):数据 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
随机推荐
- CSS样式之a标签(原文网址http://www.divcss5.com/shili/s57.shtml)
这是个人在做网站的时候整理的关于a标签的使用方法,整理一下,方便下次使用. 一.a超链接的代码 <a href="http://www.baidu.com" target=& ...
- ios 下拉列表
#import <UIKit/UIKit.h> @class FVPullDownMenu; /** 指示器状态*/ typedef enum { IndicatorStateShow = ...
- 如何在首次启动 Linux 虚拟机时对其进行自定义
在前面的教程中,你已学习如何通过 SSH 连接到虚拟机 (VM) 并手动安装 NGINX. 若要以快速一致的方式创建 VM,通常需要某种形式的自动化. 在首次启动 VM 时实现自定义的常见方法是使用 ...
- 关于Entity Framework关系配置,提示列名XXXX_Id无效的问题
问题描述 : 数据库中有两张表,如下: Member(会员)表有外键RoleId,对应的是Role(角色)表的主键Id,业务逻辑是Member表的RoleId必须与Role表的Id对应(但在设计数据表 ...
- [翻译] About Core Image
About Core Image Core Image is an image processing and analysis technology designed to provide near ...
- [翻译] OrigamiEngine
OrigamiEngine https://github.com/ap4y/OrigamiEngine Lightweight iOS and OSX audio engine with opus, ...
- Error creating bean with name xxxx,xxxx must be provided
原因: 继承父类的bean注入是set,get方法 问题: 自己的controller不能创建,因为需要的bean没有创建 解决方法: bean 注入,通过构造函数调用父类的set方法
- 【php】页面加载优化的14条原则
1. 尽可能的减少 HTTP 的请求数 [content] 2. 使用 CDN(Content Delivery Network) [server] 3. 添加 Expires 头(或者 Cach ...
- spring4声明式事务--01注解方式
1.在spring配置文件中引入 tx 命名空间 xmlns:tx="http://www.springframework.org/schema/tx" 2.配置事务管理器 < ...
- (1)构造方法和方法重载 (2)this关键字 (3)方法的传参和递归调用
1.构造方法和方法重载如: Person p = new Person(); - 声明Person类型的引用p指向Person类型的对象 p.show(); - 调用名字为show()的成员方法 1. ...