使用Repository模式构建数据库访问层

使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【二】——使用Repository模式构建数据库访问层

系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html

前言

在数据访问层应用Repository模式来隔离对领域对象的细节操作是很有意义的。它位于映射层之上作为对于数据进行CRUD操作的一个抽象层。在Repository模式中,我们可以像操作内存里的集合一样来操作数据,而Repository则负责把我们的操作更新到数据库中。

构建Repository

在构建Repository模式之前,我们先列举在我们项目中将要使用到的用例,由于我们项目的重点是Web Api,所以Repository的构建相对比较简单,并没有用泛型基类的方式来构建。

查询所有的科目,通过ID获得某个科目。

查询所有的课程以及关联的对象(导师和科目) 。

根据ID获取某个课程以及关联的对象(导师,学科以及参与该课程的学生)

查询所有的学生以及相关对象(参与的课程,课程所在学科,导师)

根据课程ID查询所有报读的学生信息

通过用户名查询学生

通过用户名和密码验证学生信息

为注册过的学生提供选课功能

学生和课程的CRUD

创建ILearningRepository接口来定义所有的用例:

public interface ILearningRepository
{
IQueryable<Subject> GetAllSubjects();
Subject GetSubject(int subjectId); IQueryable<Course> GetCoursesBySubject(int subjectId); IQueryable<Course> GetAllCourses();
Course GetCourse(int courseId);
bool CourseExists(int courseId); IQueryable<Student> GetAllStudentsWithEnrollments();
IQueryable<Student> GetAllStudentsSummary(); IQueryable<Student> GetEnrolledStudentsInCourse(int courseId);
Student GetStudentEnrollments(string userName);
Student GetStudent(string userName); Tutor GetTutor(int tutorId); bool LoginStudent(string userName, string password); bool Insert(Student student);
bool Update(Student originalStudent, Student updatedStudent);
bool DeleteStudent(int id); int EnrollStudentInCourse(int studentId, int courseId, Enrollment enrollment); bool Insert(Course course);
bool Update(Course originalCourse, Course updatedCourse);
bool DeleteCourse(int id); bool SaveAll();
}

上述的接口中已经包含了我们Api中所有需要的操作。特别说明一下在这里对于集合我们都返回IQueryable<>类型,因为这个类型能够做到按需查询,延迟加载——当我们进行多条件复合检索或者分页,排序的时候,IQueryable<>类型不会立即访问数据库,而是在集合被迭代的时候(在前台foreach展示数据的时候)才去数据库查询加载,这样可以提高访问性能,避免查询出一些不必要的数据。

现在我们新建“learningrepository”类实现ILearningRepository,在这里我给出部分实现,剩下的可以在本章最后下载源码获得:

public class LearningRepository : ILearningRepository
{
private LearningContext _ctx;
public LearningRepository(LearningContext ctx)
{
_ctx = ctx;
} public IQueryable&lt;Subject&gt; GetAllSubjects()
{
return _ctx.Subjects.AsQueryable();
} /*Rest of methods implementation goes here....*/
}

在learningrepository的构造函数中我们可以发现我们需求一个learningrepository类型来初始化我们的_ctx。这种设计模式叫做依赖注入,简单的来说就是对象的创建是通过第三方容器来实现的,而不是直接new。这样做有利于模块与模块间的耦合降低,关于更多依赖注入的信息,请参考:http://www.cnblogs.com/tylerdonet/p/3297915.html

总结

到此为止,我们的数据访问层就算基本完成了,Web Api的准备工作也就完了。从下一章开始,本次的主角Web Api就要闪亮登场了。

本章源码:http://yun.baidu.com/s/1o6wf1KQ

ajax跨域请求的解决方案

 

一直打算改造一下自己传统做网站的形式。


我是.Net程序员,含辛茹苦数年也没混出个什么名堂。

最近微信比较火, 由于现在大环境的影响和以前工作的总结和经验,我打算自己写一个数据,UI松耦合的比较新潮的模式,类似微信公众平台了也是。

先介绍下微信公众平台,平台上所有展示的动态数据,大多都是由http请求到json,然后解析结合UI产生Html从而展示在您的面前。尽管以前自己经常用xml+xsl=〉html来做。而今天主要是要做的几步:

1.接口站点,最好是用EF的强大功能这样就可以节省很多手动写接口的时间,当然现在还是手动写 感觉不会再爱了~希望博友们能推荐一些学习资源

2.web程序,所有页面均为html,所有的请求和响应都由http来完成和回馈,并且要加上Log记录。感觉这是个大工程,参照了下微信公众平台,平台光js就引用了十几二十个,还用了很多插件,高深的样子 投向崇拜的目光眼。

言归正传,ajax跨域请求的方案


前提是接口程序是你自己发布的,也就是你可以在响应中添加header。当web站点请求接口站点的时候,js会提示跨域无法请求。

1
2
<span style="font-size: 16px;">            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:9004");//我自己调试的站点
</span>

  你需要添加响应Header。 这时,你在ie下,会请求到你想要的数据, Chrome,Firfox,Maxthon等等浏览器还是请求文档失败,似乎是没指定请求的内容。

   HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");//再添加一个header

Success! 也没什么就是加了俩头

 
 
 

使用Repository模式构建数据库访问层的更多相关文章

  1. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【二】——使用Repository模式构建数据库访问层

    系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在数据访问层应用Repository模式来隔离对领域对象的细节操作是很有意义的.它位于映射层 ...

  2. MVC+Ef项目(2) 如何更改项目的生成顺序;数据库访问层Repository仓储层的实现

    我们现在先来看看数据库的生成顺序   居然是 Idal层排在第一,而 web层在第二,model层反而在第三 了   我们需要把 coomon 公用层放在第一,Model层放在第二,接下来是 Idal ...

  3. MVC+Ef项目(3) 抽象数据库访问层的统一入口;EF上下文线程内唯一

    抽象一个数据库访问层的统一入口(类似于EF的上下文,拿到上下文,就可以拿到所有的表).实际这个入口就是一个类,类里面有所有的仓储对应的属性.这样,只要拿到这个类的实例,就可以点出所有的仓储,我们在 R ...

  4. XAF使用数据库访问层缓存的提升性能

    很多时候,为了提升性能,我们可以给数据库访问层做缓存. 以下几步可以完成这个任务:1. 使用自定义的 XPObjectSpaceProvider1.1. 创建自定义的 XPObjectSpacePro ...

  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(2)-数据库访问层的设计Demo ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1)框架搭建 前言:这 ...

  6. Java 数据库访问层

    最近项目中需要对mysql进行操作,数据库的知识早在本科毕业那会就忘光了,这几年开发都没接触到数据库的操作. 借这个机会重新学习,数据库访问层是对数据库操作的一个封装,屏蔽底层的数据操作细节,通过使用 ...

  7. GG_DataAccess 数据库访问层使用dapper操作

    3.5.GG_DataAccess 数据库访问层使用dapper操作 和Model实体类同理,tt模板已写好,需要的可加qq群:547765059  自己下载.

  8. (Entity framework 应用篇)把权限判断封装在数据库访问层

    这里,我只是以一个例子,说一下简单权限控制,通过这个例子,大家可以设计庞大的权限管理层,把权限控制封装到数据库访问层,这样程序员就不用再写权限判断的代码了 首先,先看看我数据库DBContext的定义 ...

  9. 一个基于EntityFramework Core的简单数据库访问层,适用于轻量级数据库业务

    这个访问层的代码实际上是园子里某个前辈的,本人只是觉得好使,记录了下来. 本访问层需要通过Nuget安装EntityFramework Core,不过个人认为EF 6同样可以使用. 搭配数据库,最好是 ...

随机推荐

  1. 联合县城市,采用ajax,而使用ul模拟select下拉

    接待处代码 js //采用jquery展示鼠标放到省ul下拉显示 $("#province").hover(function(){                          ...

  2. 惰性函数——JS高级

    我们先来看一下js的异步提交. XHR我们在原生的时候常常用到,因为常用到,我们更多把封装到了工具库中 先看下他最常用的实现 // 旧方法 function createXHR() { var xhr ...

  3. DM8168 layout

    我们学到了以前的系统板的教训,新的版本号DM8168烤... 一级:电源.DM8168.DDR3.FPGA.CPLD.Nandflash.USB.以太网络.SATA.JTAG等待. 的地面电源部充分. ...

  4. Largest Rectangular Area in a Histogram

    题目地址:https://oj.leetcode.com/problems/largest-rectangle-in-histogram/ ,刚開始事实上没做这个题,而是在做https://oj.le ...

  5. WebBrowser控件应用:播放PPT文件

    原文:WebBrowser控件应用:播放PPT文件 一开始想的是用webform来做,用iframe加载文件,把ppt文件另存成htm,然后播放. 可是后来发现,的程序不大容易控制,所以改用winfo ...

  6. The Swift Programming Language-官方教程精译Swift(7)函数 -- Functions

    函数 函数是执行特定任务的代码自包含块.通过给定一个函数名称标识它是什么,并在需要的时候使用该名称来调用函数以执行任务. Swift的统一的功能语法足够灵活的,可表达任何东西,无论是不带参数名称的简单 ...

  7. .net 职责链来实现 插件模式

    .net 职责链来实现 插件模式 插件式的例子 QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了 eclipse ,X Server 等等 插件式的好处 插件降低框架的复杂性,把扩展功能 ...

  8. java设计模式之五原型模式(Prototype)

    原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.本小结会通过对象的复制,进行讲解.在Java中 ...

  9. 快速构建Windows 8风格应用27-漫游应用数据

    原文:快速构建Windows 8风格应用27-漫游应用数据 本篇博文主要介绍漫游应用数据概览.如何构建漫游应用数据.构建漫游应用数据最佳实践. 一.漫游应用数据概览 1.若应用当中使用了漫游应用数据, ...

  10. Java泛型和集合之泛型介绍

    在声明一个接口和类的时候可以使用尖括号带有一个或者多个参数但是当你在声明属于一个接口或者类的变量的时候或者你在创建一个类实例的时候需要提供他们的具体类型.我们来看下下面这个例子 List<Str ...