[CAMCOCO][C#]我的系统架构.服务器端.(二)----DATA层
这一层在园子里有很多很多的介绍了,这层写好之后老胡也没多研究,基本上就是参考的园子里大咖们的写法,具体的说明老胡也细说不了了,把接口和思路简单描述一下就好,如果有问题还是那句话,感谢您不吝赐教,老胡这厢有礼了。

其实如果您长期逛园子,在很多大咖们的博客里肯定都见过这类似的东西了,不错,我把数据操作提出来了,并且使用了“Migrations”来实现数据库的自动更新。
一年之前,我还是一个坚定的数据库控,觉得软件开发凡是都得首先去把数据库设计好了。直到用了EF的Code First模式之后,才发现这才是软件设计的终极,当然这只是一家之言,不过Code First的确对面向对象很有帮助,同时在设计Model层的时候,再也不同跳出到数据库层面思考了,所有的外键、关联、索引这些,都是自然而然地就出来了。顺其自然,真的是很爽的一件事,不是么?
在这套架构中,我甚至把 AutomaticMigrationsEnabled = true; 都开启了,在修改完代码中的实体模型后,只要运行程序,数据库结构都自动更新了,实际上,在用这个模式开发后,我就很少去关心数据表了。
最后,把IRepository列出来一下,应该就能说清楚本节的重点了,如有疑问,请参考园内大咖的专业文章,老胡就不一一赘述了。
public interface IRepository<T> : IRepositoryForUnitOfWork
{
/// <summary>
/// 新增数据(包含在事务中)
/// </summary>
/// <param name="entity">数据实体类</param>
/// <returns></returns>
void add(T entity);
/// <summary>
/// 更新数据(包含在事务中)
/// </summary>
/// <param name="entity">数据实体类</param>
void update(T entity);
/// <summary>
/// 删除数据:逻辑删除,通过删除标记位实现(包含在事务中)
/// </summary>
/// <param name="entity">数据实体类</param>
void delete(T entity);
/// <summary>
/// 删除数据:逻辑删除,通过删除标记位实现(包含在事务中)
/// </summary>
/// <param name="IdList">数据索引集合:逗号间隔多个索引</param>
void delete(Type ObjectClass, string IdList);
/// <summary>
/// 恢复数据:恢复被逻辑删除的数据
/// </summary>
/// <param name="ObjectClass"></param>
/// <param name="IdList">数据索引集合:逗号间隔多个索引</param>
void recover(Type ObjectClass, string IdList);
/// <summary>
/// 执行SQL语句(包含在事务中)
/// </summary>
/// <param name="SQLCommand">SQL语句</param>
void executeSQL(string SQLCommand);
/// <summary>
/// 判断指定条件的数据是否存在
/// </summary>
/// <param name="whereLambda">查询条件</param>
/// <returns></returns>
bool exists(Expression<Func<T, bool>> whereLambda);
/// <summary>
/// 获得指定的数据实体
/// </summary>
/// <param name="whereLambda">条件参数</param>
/// <returns></returns>
T read(Expression<Func<T, bool>> whereLambda);
/// <summary>
/// 获得符合指定条件的数据条数
/// </summary>
/// <param name="whereLambda">条件参数</param>
/// <returns></returns>
int count(Expression<Func<T, bool>> whereLambda);
/// <summary>
/// 获取符合条件的数据集合
/// </summary>
/// <param name="whereLamdba">条件参数</param>
/// <param name="orderName">排序列名</param>
/// <param name="isAsc">排序方式</param>
/// <returns></returns>
IQueryable<T> readList(Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc);
/// <summary>
/// 获取符合条件的数据集合:实现多个排序定义
/// </summary>
/// <param name="whereLamdba">条件参数</param>
/// <param name="orderName">排序列名</param>
/// <param name="isAsc">排序方式</param>
/// <returns></returns>
IQueryable<T> readList(Expression<Func<T, bool>> whereLamdba, string[] orderName, bool[] isAsc);
/// <summary>
/// 获取符合条件的数据带分页集合
/// </summary>
/// <param name="pageIndex">获取页码</param>
/// <param name="pageSize">页面尺寸</param>
/// <param name="totalRecord">返回:符合条件的数据条数</param>
/// <param name="pageCount">返回:符合条件的数据的页面数量</param>
/// <param name="whereLamdba">条件参数</param>
/// <param name="orderName">排序列名</param>
/// <param name="isAsc">排序方式</param>
/// <returns></returns>
IQueryable<T> readPageList(int pageIndex, int pageSize, out int totalRecord, out int pageCount, Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc);
/// <summary>
/// 获取符合条件的数据带分页集合:实现多个排序定义
/// </summary>
/// <param name="pageIndex">获取页码</param>
/// <param name="pageSize">页面尺寸</param>
/// <param name="totalRecord">返回:符合条件的数据条数</param>
/// <param name="pageCount">返回:符合条件的数据的页面数量</param>
/// <param name="whereLamdba">条件参数</param>
/// <param name="orderName">排序列名</param>
/// <param name="isAsc">排序方式</param>
/// <returns></returns>
IQueryable<T> readPageList(int pageIndex, int pageSize, out int totalRecord, out int pageCount, Expression<Func<T, bool>> whereLamdba, string[] orderName, bool[] isAsc);
}
值得一提的是,在这个接口定义中我制作了一个特殊的接口
void executeSQL(string SQLCommand);
用于执行直接的SQL语句,说来惭愧,老胡对LINQ TO EF, LINQ TO SQL这些东西理解还是过于浅显,好多复杂的东西要不是实现不了,要不就是觉得实现起来太繁琐,还不如直接来个SQL方便,所以就暴露出来这个接口(当然,老胡自我安慰的说法是:万一哪天有个小弟要用这个框架,没法通过LINQ TO EF来实现操作了,这不还有个后门么,嘿嘿。。。)
另外,这个架构下,我把所有的删除都做成逻辑删除了,之前的系统中好多都是做的物理删除,最后数据(尤其是什么客户资料啊、订单信息啊)被删后,无限痛苦啊。
OK,这层就这样吧,真正体现老胡智慧的模型层和业务逻辑层就快出现了,老胡想静静,先。。。
[CAMCOCO][C#]我的系统架构.服务器端.(二)----DATA层的更多相关文章
- [CAMCOCO][C#]我的系统架构.服务器端.(四)----Model层 实体的自我验证
这是Model的第二篇,上一篇点这里 这块完全是扒了@何镇汐大神博客里的教程实现的,在这之前完全没想到数据验证居然可以这样做!!在此表示严重感谢!!! 点击这里可以去了解这个方法的原理,老胡估计自己是 ...
- [CAMCOCO][C#]我的系统架构.服务器端.(三)----Model层
我估计一片帖子写不完这个,慢慢来吧... 先上个图,按照图来说明应该容易说清楚一些. 在Model Core核心代码中,老胡创建了一个类 CAMCOCO.Model.Core,要求今后在Model L ...
- [CAMCOCO][C#]我的系统架构.服务器端.(一)
尽量少的前言 虽然写了N年代码了,但总觉得什么东西都是囫囵吞枣,无法尽得其精髓.最近整理了一套心目中的架构,如有错误之处,烦劳不吝指正,老胡在此不胜感激!! 第一篇 我心目中的架构 做了无数个系统,写 ...
- [CAMCOCO][C#]我的系统架构 总图
之前写的感觉有点乱,把架构的设计图先放上来吧,对照着说. CAMCOCO架构能够支持的模型: 1.B/S程序,比如CRM什么的,和访问普通网站没什么区别,都是从WEB服务器上进行操作: 2.APP的服 ...
- 时序数据库 Apache-IoTDB 源码解析之系统架构(二)
上一章聊到时序数据是什么样,物联网行业中的时序数据的特点:存量数据大.新增数据多(采集频率高.设备量多).详情请见: 时序数据库 Apache-IoTDB 源码解析之前言(一) 打一波广告,欢迎大家访 ...
- Android系统简介(中):系统架构
Android的系统架构栈分为4层,从上往下分别是Applications.Application framework.Libraries & Android Runtime.Linux ...
- 认识iOS系统架构
关于本文: 文章主要介绍iOS系统架构中的四层结构的内容.常用的框架.大致的功能,然后对iOS开发人员的发展提出自己的一些拙见. 一.iOS系统是基于UNIX系统,所有从系统稳定性上来说的确比其他操作 ...
- iOS 系统架构
https://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/iPhoneOSTechOverview/ ...
- Android系统架构说明介绍
Android系统架构说明介绍 Android系统架构和一些普遍的操作系统差不多,都是采用了分层的架构,从他们之间的架构图看,Android系统架构分为四个层,从高层到低层分别是应用程序层.应用程序框 ...
随机推荐
- Web网站压力测试工具
使用Microsoft Web Application Stress Tool对web进行压力测试 不错关于压力测试博客: http://blog.sina.com.cn/s/blog_5155e8d ...
- VMWare虚拟机网络的三种工作模式
VMWare提供了三种工作模式: 1.bridged(桥接模式) 在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器.在桥接模式下,需要手工为虚拟系 ...
- TP第2个项目总结
1.参数尼玛传接受要非数字方法 $id = $this->_get('id','intval',0); $field_wc = $this->_get('wc_field'); 2.参数不 ...
- MyBatis中主要类的生命周期和应用范围
转自:http://ccchhhlll1988-163-com.iteye.com/blog/1420026 MyBatis中常用的类就要数SqlSessionFactoryBuilder.SqlSe ...
- Java Web系统经常使用的第三方接口
1. Web Service 接口 1.1 接口方式说明和长处 在笔者的开发生涯中,当作为接口提供商给第三方提供接口时,以及作为client去调用第三方提供的接口时,大部分时候都是使用 Web Se ...
- alue of type java.lang.String cannot be converted to JSONObject
/** * 4.0以下系统处理掉返回json的BOM头 * * @param jsonStr * @return */ public static String getJson(String json ...
- 解决fonts.gstatic.com无法访问
最近很多google的服务又在大陆地区受限了,原因不做过多讨论.屏蔽这些服务不仅仅意味着gmail,谷歌学术等方便的工具使用受到限制,更意味着很多寄托于google的web服务无法使用.wordpre ...
- 高级进程间通信之UNIX域套接字
UNIX域套接字用于在同一台机器上运行的进程之间的通信.虽然因特网域套接字可用于同一目的,但UNIX域套接字的效率更高.UNIX域套接字仅仅复制数据:它们并不执行协议处理,不需要添加或删除网络报头,无 ...
- Nop关键技术点概述
数据访问层 Nop.Data项目包含用于与数据库及其它数据存储交互的类和功能.Nop.Data类库帮助将数据访问逻辑和业务对象分离.Nop使用的是Entity Framework Code First ...
- 深入理解Redis中的主键失效及其实现机制
参考:http://blog.sina.com.cn/s/articlelist_1221155353_0_1.html 作为一种定期清理无效数据的重要机制,主键失效存在于大多数缓存系统中,Reids ...