使用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<Subject> 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
使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【二】——使用Repository模式构建数据库访问层的更多相关文章
- ASP.NET Web Api构建基于REST风格的服务实战系列教程
使用ASP.NET Web Api构建基于REST风格的服务实战系列教程[十]——使用CacheCow和ETag缓存资源 系列导航地址http://www.cnblogs.com/fzrain/p/3 ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【开篇】【持续更新中。。。】
最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tuto ...
- 使用ASP.NET WEB API构建基于REST风格的服务实战系列教程(一)——使用EF6构建数据库及模型
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 使用Entity Framework Code First模式构建数据库对象 已经决定使用EF C ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【九】——API变了,客户端怎么办?
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 一旦我们将API发布之后,消费者就会开始使用并和其他的一些数据混在一起.然而,当新的需求出现 ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【八】——Web Api的安全性
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 这一篇文章我们主要来探讨一下Web Api的安全性,到目前为止所有的请求都是走的Http协议 ...
- [转]使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【八】——Web Api的安全性
本文转自:http://www.cnblogs.com/fzrain/p/3552423.html 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我们对资源的CRUD操作都是通过相应的Http方法来实现——Post(新 ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【外传】——Attribute Routing
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 题外话:由于这个技术点是新学的,并不属于原系列,但借助了原系列的项目背景,故命名外传系列,以后也可 ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【三】——Web Api入门
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 经过前2节的介绍,我们已经把数据访问层搭建好了,从本章开始就是Web Api部分了.在正式开 ...
随机推荐
- git创建仓库
创建仓库 git init: Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令. ...
- Linux IO Scheduler(Linux IO 调度器)
每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...
- 天朝git的使用
开源中国社区 官方网站 https://git.oschina.net/ 开源中国社区成立于2008年8月,其目的是为中国的IT技术人员提供一个全面的.快捷更新的用来检索开源软件以及交流使用开源经验的 ...
- 素数筛 poj 3518
给你一个n 求包括n的一个非素数区间有多长 +1输出 #include<stdio.h> #include<string.h> #include<algorithm> ...
- httpclient提示Cookie rejected: violates RFC 2109: domain must start with a dot
使用httpclient时发生如下告警信息: WARN - HttpMethodBase.processResponseHeaders(1505) | Cookie rejected: "$ ...
- Win7下如何设置护眼的电脑豆沙绿界面?保护眼睛的颜色设置教程
关爱心灵的窗户——眼睛! 随着科技发展,使用电脑的人越来越多,由于使用电脑时间过长,我们的眼睛也越发容易疲劳,干燥.如何才能使电脑对人眼的伤害减小到最 小. 小编建议大家可以把窗口背景色设置成护眼色. ...
- FAILED java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI:hdfs:192.*
运行的参数配置 hdfs:192.168.58.180/cf/userItem.txt 应该写成 hdfs://192.*
- [Poi2000]公共串
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> ...
- CCNET+ProGet+Windows Batch搭建全自动的内部包打包和推送及管理平台
所要用的工具: 1.CCNET(用于检测SVN有改动提交时自动构建,并运行nuget的自动打包和推送批处理) 2.ProGet(目前见到最好用的nuget内部包管理平台) 3.Windows Batc ...
- Android成长日记-Android四大组件之Service组件的学习
1.什么是Service? Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序,Service与Activity的区别在于:Service一直在后台运行,它 ...