http://www.hysql.org/aspnet/20180630/5712.html

先来一张项目的层级结构图:

Model:模型层,主要是各种类型、枚举以及ORM框架,框架完成数据库和实体类的映射。项目中选用了微软的开源ORM框架 EntityFramework 6.0 (以下简称EF),数据库则选择了微软的轻量级数据库SQL Server Compact 4.0本地数据库(简称Compact),Compact对EF支持比较完美,又属于文档型数据库,部署起来比较简洁。

DAL:数据访问层,主要是对数据库的操作层,为业务逻辑层或表示层提供数据服务。

IDAL:数据访问接口层,是数据访问层的接口,降低耦合。

DALFactory:数据会话层,封装了所有数据操作类实例的创建,将数据访问层与业务逻辑层解耦。

BLL:业务逻辑层,主要负责对数据层的操作,把一些数据层的操作进行组合以完成业务的需要。

IBLL:业务逻辑接口层,业务逻辑层的接口,降低耦合。

WebApp:表现层,是一个ASP.NET MVC项目,完成具体网站的实现。

Common:通用层,用来存放一些工具类。

下面是各个层级之间具体的实现,首先创建以 项目名.层级名 命名的各个层次,除WebApp层为ASP.NET MVC项目外,其余均创建为类库项目。

模型层的构建

先建立模型层,新建ASP.NET 实体数据模型,关联到已经设计好的数据库,EF自动完成模型类的创建。

数据访问层的构建

DAL层中,我们首先需要一个方法来获取单例的EF数据操纵上下文对象,以保证每个用户访问时只有使用一个上下文对象对数据库进行操作。

DbContextFactory.cs

using System.Data.Entity;
using System.Runtime.Remoting.Messaging;
using PMS.Model; namespace PMS.DAL
{
public class DbContextFactory
{
/// <summary>
/// 负责创建EF数据操作上下文实例,必须保证线程内唯一
/// </summary>
public static DbContext CreateContext()
{
DbContext dbContext = (DbContext)CallContext.GetData("dbContext");
if (dbContext != null) return dbContext;
dbContext = new PMSEntities();
CallContext.SetData("dbContext", dbContext);
return dbContext;
}
}
}

为User类创建DAL层,实现查询、分页查询、增加、删除和修改这五个基本的方法:

UserDAL.cs

using System;
using System.Data.Entity;
using System.Linq;
using PMS.IDAL; namespace PMS.DAL
{
public partial class UserDal {
public DbContext DbEntities = DbContextFactory.CreateContext(); /// <summary>
/// 查询过滤
/// </summary>
/// <param name="whereLamada">过滤条件Lambda表达式</param>
/// <returns>实体集合</returns>
public IQueryable<UserDal> LoadEntities(System.Linq.Expressions.Expression<Func<UserDal, bool>> whereLamada)
{
return DbEntities.Set<UserDal>().Where(whereLamada);
} /// <summary>
/// 分页查询
/// </summary>
/// <typeparam name="TS">排序类型</typeparam>
/// <param name="pageIndex">查询的页码</param>
/// <param name="pageSize">每页显示的数目</param>
/// <param name="totalCount">符合条件的总行数</param>
/// <param name="whereLambda">过滤条件Lambda表达式</param>
/// <param name="orderbyLambda">排序Lambda表达式</param>
/// <param name="isAsc">排序方向</param>
/// <returns>实体集合</returns>
public IQueryable<UserDal> LoadPageEntities<TS>(int pageIndex, int pageSize, out int totalCount, System.Linq.Expressions.Expression<Func<UserDal, bool>> whereLambda, System.Linq.Expressions.Expression<Func<UserDal, TS>> orderbyLambda, bool isAsc)
{
var temp = DbEntities.Set<UserDal>().Where(whereLambda);
totalCount = temp.Count();
temp = isAsc ? temp.OrderBy(orderbyLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize) : temp.OrderByDescending(orderbyLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize);
return temp;
} /// <summary>
/// 删除数据
/// </summary>
/// <param name="entity">待删数据</param>
/// <returns>删除结果</returns>
public bool DeleteEntity(UserDal entity)
{
DbEntities.Entry(entity).State = EntityState.Deleted;
return true;
} /// <summary>
/// 编辑数据
/// </summary>
/// <param name="entity">待编辑数据</param>
/// <returns>编辑结果</returns>
public bool EditEntity(UserDal entity)
{
DbEntities.Entry(entity).State = EntityState.Modified;
return true;
} /// <summary>
/// 添加数据
/// </summary>
/// <param name="entity">待添加数据</param>
/// <returns>已添加数据</returns>
public UserDal AddEntity(UserDal entity)
{
entity = DbEntities.Set<UserDal>().Add(entity);
return entity;
}
}
}

注:这里的增删改操作并不即时进行,而是在封装在数据会话层中,以实现工作单元模式,提高数据库的操作效率。

考虑到每个类都需要实现相同的数据操作,我们可以将以上方法封装到一个泛型基类中,各类型只需要继承泛型基类就可以实现以上方法:

BaseDal.cs

using System;
using System.Data.Entity;
using System.Linq; namespace PMS.DAL
{
public class BaseDal<T> where T:class ,new()
{
public DbContext DbEntities = DbContextFactory.CreateContext(); /// <summary>
/// 查询过滤
/// </summary>
/// <param name="whereLamada">过滤条件Lambda表达式</param>
/// <returns>实体集合</returns>
public IQueryable<T> LoadEntities(System.Linq.Expressions.Expression<Func<T, bool>> whereLamada)
{
return DbEntities.Set<T>().Where(whereLamada);
} /// <summary>
/// 分页查询
/// </summary>
/// <typeparam name="TS">排序类型</typeparam>
/// <param name="pageIndex">查询的页码</param>
/// <param name="pageSize">每页显示的数目</param>
/// <param name="totalCount">符合条件的总行数</param>
/// <param name="whereLambda">过滤条件Lambda表达式</param>
/// <param name="orderbyLambda">排序Lambda表达式</param>
/// <param name="isAsc">排序方向</param>
/// <returns>实体集合</returns>
public IQueryable<T> LoadPageEntities<TS>(int pageIndex, int pageSize, out int totalCount, System.Linq.Expressions.Expression<Func<T, bool>> whereLambda, System.Linq.Expressions.Expression<Func<T, TS>> orderbyLambda, bool isAsc)
{
var temp = DbEntities.Set<T>().Where(whereLambda);
totalCount = temp.Count();
temp = isAsc ? temp.OrderBy(orderbyLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize) : temp.OrderByDescending(orderbyLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize);
return temp;
} /// <summary>
/// 删除数据
/// </summary>
/// <param name="entity">待删数据</param>
/// <returns>删除结果</returns>
public bool DeleteEntity(T entity)
{
DbEntities.Entry(entity).State = EntityState.Deleted;
return true;
} /// <summary>
/// 编辑数据
/// </summary>
/// <param name="entity">待编辑数据</param>
/// <returns>编辑结果</returns>
public bool EditEntity(T entity)
{
DbEntities.Entry(entity).State = EntityState.Modified;
return true;
} /// <summary>
/// 添加数据
/// </summary>
/// <param name="entity">待添加数据</param>
/// <returns>已添加数据</returns>
public T AddEntity(T entity)
{
entity = DbEntities.Set<T>().Add(entity);
//DbEntities.SaveChanges();
return entity;
}
}
}

UserDal继承BaseDal

using PMS.IDAL;
using PMS.Model; namespace PMS.DAL
{
public partial class UserDal : BaseDal<User>
{ }
}

数据访问接口层的构建

然后我们建立相应的IbaseDal接口和IUserDal接口,并且使UserDal类实现IUserDal接口

IBaseDal:

using System;
using System.Linq; namespace PMS.IDAL
{
public interface IBaseDal<T> where T:class,new()
{
IQueryable<T> LoadEntities(System.Linq.Expressions.Expression<Func<T, bool>> whereLamada); IQueryable<T> LoadPageEntities<s>(int pageIndex, int pageSize, out int totalCount,
System.Linq.Expressions.Expression<Func<T, bool>> whereLambda,
System.Linq.Expressions.Expression<Func<T, s>> orderbyLambda, bool isAsc); bool DeleteEntity(T entity); bool EditEntity(T entity); T AddEntity(T entity);
}
}

IUserDal:

using PMS.Model;
namespace PMS.IDAL
{
public partial interface IUserDal:IBaseDal<User>
{ }
}

UserDal实现IUserDal接口:

public partial class UserDal : BaseDal<User>,IUserDal

数据会话层的构建

抽象工厂类AbstractFactory:

using System.Configuration;
using System.Reflection;
using PMS.IDAL; namespace PMS.DALFactory
{
public partial class AbstractFactory
{
//读取保存在配置文件中的程序集名称与命名空间名
private static readonly string AssemblyPath = ConfigurationManager.AppSettings["AssemblyPath"];
private static readonly string NameSpace = ConfigurationManager.AppSettings["NameSpace"];
/// <summary>
/// 获取UserDal的实例
/// </summary>
/// <returns></returns>
public static IUserDal CreateUserInfoDal()
{
var fullClassName = NameSpace + ".UserInfoDal";
return CreateInstance(fullClassName) as IUserDal;
}
/// <summary>
/// 通过反射获得程序集中某类型的实例
/// </summary>
/// <param name="className"></param>
/// <returns></returns>
private static object CreateInstance(string className)
{
var assembly = Assembly.Load(AssemblyPath);
return assembly.CreateInstance(className);
}
}
}

数据会话类DbSession:

using System.Data.Entity;
using PMS.IDAL;
using PMS.DAL; namespace PMS.DALFactory
{
public partial class DbSession:IDbSession
{
public DbContext Db
{
get { return DbContextFactory.CreateContext(); }
} private IUserDal _userDal;
public IUserDal UserDal
{
get { return _userDal ?? (_userDal = AbstractFactory.CreateUserInfoDal()); }
set { _userDal = value; }
} /// <summary>
/// 工作单元模式,统一保存数据
/// </summary>
/// <returns></returns>
public bool SaveChanges()
{
return Db.SaveChanges() > 0;
}
}
}

业务逻辑层的构建

业务类基类BaseService

using System;
using System.Linq;
using System.Linq.Expressions;
using PMS.DALFactory;
using PMS.IDAL; namespace PMS.BLL
{
public abstract class BaseService<T> where T:class,new()
{
public IDbSession CurrentDbSession
{
get
{
return new DbSession();
}
}
public IBaseDal<T> CurrentDal { get; set; }
public abstract void SetCurrentDal();
public BaseService()
{
SetCurrentDal();//子类一定要实现抽象方法,以指明当前类的子类类型。
} /// <summary>
/// 查询过滤
/// </summary>
/// <param name="whereLambda"></param>
/// <returns></returns>
public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
{
return CurrentDal.LoadEntities(whereLambda);
} /// <summary>
/// 分页
/// </summary>
/// <typeparam name="s"></typeparam>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="totalCount"></param>
/// <param name="whereLambda"></param>
/// <param name="orderbyLambda"></param>
/// <param name="isAsc"></param>
/// <returns></returns>
public IQueryable<T> LoadPageEntities<s>(int pageIndex, int pageSize, out int totalCount, Expression<Func<T, bool>> whereLambda,
Expression<Func<T, s>> orderbyLambda, bool isAsc)
{
return CurrentDal.LoadPageEntities<s>(pageIndex, pageSize, out totalCount, whereLambda, orderbyLambda, isAsc);
} /// <summary>
/// 删除
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public bool DeleteEntity(T entity)
{
CurrentDal.DeleteEntity(entity);
return CurrentDbSession.SaveChanges();
} /// <summary>
/// 编辑
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public bool EditEntity(T entity)
{
CurrentDal.EditEntity(entity);
return CurrentDbSession.SaveChanges();
} /// <summary>
/// 添加数据
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public T AddEntity(T entity)
{
CurrentDal.AddEntity(entity);
CurrentDbSession.SaveChanges();
return entity;
}
}
}

UserService类:

using PMS.IBLL;
using PMS.Model; namespace PMS.BLL
{
public partial class UserService : BaseService<User>
{
public override void SetCurrentDal()
{
CurrentDal = CurrentDbSession.UserDal;
}
}
}

业务逻辑接口层的构建

直接建立对应的接口并使用UserService类实现IUserService接口

IBaseService接口:

using System;
using System.Linq;
using System.Linq.Expressions;
using PMS.IDAL; namespace PMS.IBLL
{
public interface IBaseService<T> where T : class,new()
{
IDbSession CurrentDbSession { get; }
IBaseDal<T> CurrentDal { get; set; }
void SetCurrentDal();
IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda); IQueryable<T> LoadPageEntities<s>(int pageIndex, int pageSize, out int totalCount,
Expression<Func<T, bool>> whereLambda,
Expression<Func<T, s>> orderbyLambda, bool isAsc); bool DeleteEntity(T entity);
bool EditEntity(T entity);
T AddEntity(T entity);
}
}

IUserService接口:

using PMS.Model;

namespace PMS.IBLL
{
public partial interface IUserService:IBaseService<User>
{ }
}

使用UserService类实现IUserService接口:

public partial class UserService : BaseService<User>, IUserService

以上我们就完成了整个框架中关于User类的各层次的实现。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

  • MVC 5 第二章 MVC5应用程序项目结构
  • 使用ASP.NET.4.5.1+MVC5.0 搭建一个包含 Ninject框架 项目
  • ASP.NET MVC5网站开发项目框架(二)
  • Node.js与Sails ~项目结构与Mvc实现及日志机制
  • iOS开发中常见的项目文件与MVC结构优化思路解析
  • 解读ASP.NET 5 & MVC6系列教程(3):项目发布与部署
  • Asp.Net MVC3.0如何项目部署到Win7 64位系统
  • 解读ASP.NET 5 & MVC6系列教程(2):初识项目
  • 在ASP.NET MVC项目中使用RequireJS库的用法示例
  • Eclipse 使用Maven构建SpringMVC项目

相关拓展:三层架构三层结构原理
3个层次中,系统主要功能和业务逻辑都在业务逻辑层进行处理。

所谓三层体系结构,是在客户端与数据库之间加入了一个“中间层”,也叫组件层。这里所说的三层体系,不是指物理上的三层,不是简单地放置三台机器就是三层体系结构,也不仅仅有B/S应用才是三层体系结构,三层是指逻辑上的三层,即把这三个层放置到一台机器上。

三层体系的应用程序将业务规则、数据访问、合法性校验等工作放到了中间层进行处理。通常情况下,客户端不直接与数据库进行交互,而是通过COM/DCOM通讯与中间层建立连接,再经由中间层与数据库进行交互。

asp.net mvc 加三层架构 完美搭配的更多相关文章

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

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

  2. Asp.Net MVC简单三层架构(MVC5+EF6)

    三层架构与MVC的关系 三层架构是一个分层式的软件体系架构设计,分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL).分层的目的是为了实现“高内聚,低耦合”的思想,有利于系统后期的维护.更 ...

  3. Asp.Net MVC<一> : 三层架构、MVC

    MVC.MVP.MVVM.Angular.js.Knockout.js.Backbone.js.React.js.Ember.js.Avalon.js.Vue.js 概念摘录 认清Android框架 ...

  4. Asp.Net MVC+EF+三层架构的完整搭建过程

    架构图: 使用的数据库: 一张公司的员工信息表,测试数据 解决方案项目设计: 1.新建一个空白解决方案名称为Company 2.在该解决方案下,新建解决方案文件夹(UI,BLL,DAL,Model) ...

  5. Asp.Net MVC+EF+三层架构

    架构图: 使用的数据库: 一张公司的员工信息表,测试数据 解决方案项目设计: 1.新建一个空白解决方案名称为Company 2.在该解决方案下,新建解决方案文件夹(UI,BLL,DAL,Model) ...

  6. mvc和三层架构到底有什么区别

    原文地址:http://zhidao.baidu.com/question/82001542.html?qbl=relate_question_3&word=MVC%20%CA%FD%BE%D ...

  7. MVC和三层架构

    从最开始写程序到现在,一路上听到架构这个词已经无数次了,在工作和圈子里也不停听到大家在讨论它,但是很多时候发现不少人对这个概念的理解都是很模糊的,无意间在知道上看到一个朋友的回答,感觉很不错,特转帖到 ...

  8. 从MVC和三层架构说到SSH整合开发

    相信很多人都认同JavaWeb开发是遵从MVC开发模式的,遵从三层架构进行开发的,是的,大家都这么认同.但是相信大家都会有过这样一个疑问,if(MVC三层模式==三层架构思想)out.println( ...

  9. 关于ASP.NET MVC+Repository+Service架构的一些思考

    看了一些ASP.NET MVC开源项目后的一些想法,关于ASP.NET MVC+Repository+Service架构的一些思考 最近在学习ASP.NET MVC 2.0的一些开源项目,发现这些项目 ...

随机推荐

  1. Linux 查看磁盘或文件夹及文件大小

    当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力.    du可以查看文件及文件夹的大小. ...

  2. golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web

    golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web Nginx 部署 - beego: 简约 & 强大并存的 Go 应用框架https://bee ...

  3. system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk

    elasticsearch启动时遇到的错误 这个是elasticsearch配置文件的问题. 解决办法: 在elasticsearch.yml配置文件中 添加     bootstrap.system ...

  4. tft屏图像显示也成功完成

    2010-04-30 14:18:00 tft屏图像显示也成功完成. 其实有了刷屏的经验,图像显示就很简单. void address_set(uint x1,uint y1,uint x2,uint ...

  5. python 之xml.etree.ElementTree

    Element类型是一种灵活的容器对象,用于在内存中存储结构化数据. [注意]xml.etree.ElementTree模块在应对恶意结构数据时显得并不安全. 每个element对象都具有以下属性: ...

  6. glog日志库移植Android平台

    1.在linux平台下使用ndk交叉编译链编译glog生成libglog.a静态库. 2.将生成的库文件与头文件放到Android项目中,使用JNI方法调用. 3.编译遇到错误“stderr.stdo ...

  7. GoldenGate 12.2抽取Oracle 12c多租户配置过程

    linux下安装12c 重启linux之后,dbca PDB/CDB使用 SQL> select instance_name from v$instance; INSTANCE_NAME --- ...

  8. 我是这样手写 Spring 的(麻雀虽小五脏俱全)

    人见人爱的 Spring 已然不仅仅只是一个框架了.如今,Spring 已然成为了一个生态.但深入了解 Spring 的却寥寥无几.这里,我带大家一起来看看,我是如何手写 Spring 的.我将结合对 ...

  9. 离开(切换)当前页面时改变页面title

    document.addEventListener('visibilitychange', function () { if (document.visibilityState == 'hidden' ...

  10. qt裁剪

    1. qt裁剪是什么,qt有哪些模块 1.1 2. windows消息机制,qt的signal slot,android/ios消息机制?