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

简单介绍一下三层架构, 三层架构从上到下分:表现层(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)的更多相关文章

  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. animation 秒简单笔记

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 最长斐波那契序列-LeetCode-873

    英文版A sequence X_1, X_2, ..., X_n is fibonacci-like if: - n >= 3- X_i + X_{i+1} = X_{i+2} for all ...

  3. Centos 安装Dokuwiki

    一.前言 DokuWiki是一个开源wiki引擎程序,运行于PHP环境下.DokuWiki程序小巧而功能强大.灵活,适合中小团队和个人网站知识库的管理. 二.环境 在centos6 下安装apache ...

  4. leetCode题解之Jewels and Stones

    1.题目描述 2.分析 使用HashTable 是解决这种的好方法. 3.代码 int numJewelsInStones(string J, string S) { map<char,int& ...

  5. windows下查看端口占用以及进程名称

    http://www.cnblogs.com/rollenholt/archive/2012/08/17/2644657.html

  6. CVE-2013-2551漏洞成因与利用分析(ISCC2014 PWN6)

    CVE-2013-2551漏洞成因与利用分析 1. 简介 VUPEN在Pwn2Own2013上利用此漏洞攻破了Win8+IE10,5月22日VUPEN在其博客上公布了漏洞的细节.它是一个ORG数组整数 ...

  7. 原生JavaScript可以干那些事情

    1.原生JavaScript实现字符串长度截取 function cutstr(str, len) { var temp; var icount = 0; var patrn = /[^\x00-\x ...

  8. 字节(byte)与位(bit)基础回顾

    预估方式:一个uid,String类型,最长约50字节,即50Byte,一天100亿PV,则100亿*50Byte,约500G容量存ES中或Hbase中,无法存日志文件中,一个docker磁盘才50G ...

  9. IntelliJ 禁用 Search Everywhere

    发现自: https://youtrack.jetbrains.com/issue/IDEA-114933#comment=27-603899 Open lib/resources.jar/idea/ ...

  10. python多进程(二)

    之前实现的数据共享的方式只有两种结构Value和Array.Python中提供了强大的Manager专门用来做数据共享的,Manager是进程间数据共享的高级接口. Manager()返回的manag ...