EF架构~EF异步改造之路~仓储接口的改造
C#5.0带来了并行编程
{C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程}
随着C#5.0在.net4.5出来之后,它们主推的并行技术也逐渐变得越来越热,这种热量已经传到了我这里,身为仓储大叔的我,一定也对自己的仓储进行并行化的改造,这是大势所趋,呵呵,今天主要是把我的IRepository.Core项目进行扩展,即添加一些对应的并行接口,然后让我的并行(异步)仓储去实现它,事实上,.net的ef这块,实现异步(并行)非常容易,在C#5.0里由于async/await关键字的出现,这使得实现异步变得更加容易了,呵呵,还是那句话,身为.net领域的程序编写者,我感到万心幸福!
IRepository变成了IRepositoryAsync
/// <summary>
/// 异步操作
/// 基础的数据操作规范
/// 与ORM架构无关
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public interface IRepositoryAsync<TEntity>
where TEntity : class
{
/// <summary>
/// 设定数据上下文,它一般由构架方法注入
/// </summary>
/// <param name="unitOfWork"></param>
void SetDbContext(IUnitOfWork unitOfWork); /// <summary>
/// 添加实体并提交到数据服务器
/// </summary>
/// <param name="item">Item to add to repository</param>
Task Insert(TEntity item); /// <summary>
/// 移除实体并提交到数据服务器
/// 如果表存在约束,需要先删除子表信息
/// </summary>
/// <param name="item">Item to delete</param>
Task Delete(TEntity item); /// <summary>
/// 修改实体并提交到数据服务器
/// </summary>
/// <param name="item"></param>
Task Update(TEntity item); /// <summary>
/// 得到指定的实体集合(延时结果集)
/// Get all elements of type {T} in repository
/// </summary>
/// <returns>List of selected elements</returns>
IQueryable<TEntity> GetModel(); /// <summary>
/// 根据主键得到实体
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
TEntity Find(params object[] id);
}
IExtensionRepository变成了IExtensionRepositoryAsync
/// <summary>
/// 异步操作
/// 扩展的Repository操作规范
/// </summary>
public interface IExtensionRepositoryAsync<TEntity> :
IRepositoryAsync<TEntity>,
IOrderableRepository<TEntity>
where TEntity : class
{
/// <summary>
/// 添加集合[集合数目不大时用此方法,超大集合使用BulkInsert]
/// </summary>
/// <param name="item"></param>
Task Insert(IEnumerable<TEntity> item); /// <summary>
/// 修改集合[集合数目不大时用此方法,超大集合使用BulkUpdate]
/// </summary>
/// <param name="item"></param>
Task Update(IEnumerable<TEntity> item); /// <summary>
/// 删除集合[集合数目不大时用此方法,超大集合使用批量删除]
/// </summary>
/// <param name="item"></param>
Task Delete(IEnumerable<TEntity> item); /// <summary>
/// 根据指定lambda表达式,得到延时结果集
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
IQueryable<TEntity> GetModel(Expression<Func<TEntity, bool>> predicate); /// <summary>
/// 根据指定lambda表达式,得到第一个实体
/// </summary>
/// <param name="predicate"></param>
/// <returns></returns>
TEntity Find(Expression<Func<TEntity, bool>> predicate); /// <summary>
/// 批量添加,添加之前可以去除自增属性,默认不去除
/// </summary>
/// <param name="item"></param>
/// <param name="isRemoveIdentity"></param>
Task BulkInsert(IEnumerable<TEntity> item, bool isRemoveIdentity); /// <summary>
/// 批量添加
/// </summary>
/// <param name="item"></param>
Task BulkInsert(IEnumerable<TEntity> item); /// <summary>
/// 批量更新
/// </summary>
/// <param name="item"></param>
Task BulkUpdate(IEnumerable<TEntity> item, params string[] fieldParams); /// <summary>
/// 批量删除
/// </summary>
/// <param name="item"></param>
Task BulkDelete(IEnumerable<TEntity> item); /// <summary>
/// 保存之后
/// </summary>
event Action<SavedEventArgs> AfterSaved;
/// <summary>
/// 保存之前
/// </summary>
event Action<SavedEventArgs> BeforeSaved; }
ISpecificationRepository变成了ISpecificationRepositoryAsync
/// <summary>
/// EF底层构架,关于规约功能的仓储接口
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public interface ISpecificationRepositoryAsync<TEntity> :
IExtensionRepositoryAsync<TEntity>
where TEntity : class
{
/// <summary>
/// 根据指定规约,得到延时结果集
/// </summary>
/// <param name="specification"></param>
/// <returns></returns>
IQueryable<TEntity> GetModel(ISpecification<TEntity> specification); /// <summary>
/// 根据指定规约,得到第一个实体
/// </summary>
/// <param name="specification"></param>
/// <returns></returns>
TEntity Find(ISpecification<TEntity> specification); /// <summary>
/// 带排序功能的,根据指定规约,得到结果集
/// </summary>
/// <param name="orderBy"></param>
/// <param name="specification"></param>
/// <returns></returns>
IQueryable<TEntity> GetModel(Action<IOrderable<TEntity>> orderBy, ISpecification<TEntity> specification); }
大家可以看到,仓储大叔的异步操作接口都是以Async结尾的,这也是遵从了微软的规范的,例如同步的ToList()方法在改成异步后变成了ToListAsync(),而占占并没有在原有接口上进行修改,而是扩展了异步接口,方法名称并没有变,感觉这样对程序开发者
来说更友好,更能接受,即我们的CUD操作还是(Insert,Update,Delete),只是在接口上进行区分,你用IRepository接口来声明实例,生成的就是同步操作,而使用IRepositoryAsync声明的实例,就是以异步的方式实现操作。
EF架构~EF异步改造之路~仓储接口的改造的更多相关文章
- EF架构~EF异步改造之路~仓储接口的改造~续
回到目录 返回异步与并行目录 在写完仓储接口的改造改造后,总觉得有个代码的坏味道,这种味道源于它的DRP,即重复的代码太多了,即异步操作和同步操作其实只是在insert,update和delete上有 ...
- EF架构~EF异步改造之路~让DbContextRepository去实现异步接口
回到目录 返回异步与并行目录 上一讲中,我们定义了三个异步操作接口,这回我们将对它进行实现,而有一个基础知识需要大家清楚,那就是实现接口的方式,一般我们使用默认的方式(隐式实现),这种方法实现的接口方 ...
- 关于MVC EF架构及Repository模式的一点心得
一直都想写博客,可惜真的太懒了或者对自己的描述水平不太自信,所以...一直都是不想写的状态,关于领域驱动的东西看了不少,但是由于自己水平太差加上工作中实在用不到,所以一直处于搁置状态,最近心血来潮突然 ...
- EF架构~基于EF数据层的实现
回到目录 之前写过关于实现一个完整的EF架构的文章,文章的阅读量也是满大的,自己很欣慰,但是,那篇文章是我2011年写的,所以,技术有些不成熟,所以今天把我的2014年写的EF底层架构公开一下,这个架 ...
- EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~终结~配置的优化和事务里读写的统一
回到目录 本讲是通过DbCommand拦截器来实现读写分离的最后一讲,对之前几篇文章做了一个优化,无论是程序可读性还是实用性上都有一个提升,在配置信息这块,去除了字符串方式的拼接,取而代之的是sect ...
- EF架构~为EF DbContext生成的实体添加注释(T5模板应用)
回到目录 相关文章系列 第八回 EF架构~将数据库注释添加导入到模型实体类中 第二十一回 EF架构~为EF DbContext生成的实体添加注释(T4模板应用) 第二十二回EF架构~为EF DbCo ...
- EF架构~数据分批批量提交
回到目录 对于大数据量提交,包括插入,更新和删除,我始终不建议用EF自带的方法,因为它会增加与数据库的交互次数,一般地,EF的一个上下文在提交时会打开一个数据连接,然后把转换成的SQL语句一条一条的发 ...
- EF架构~扩展一个分页处理大数据的方法
回到目录 最近总遇到大数据的问题,一次性处理几千万数据不实际,所以,我们需要对大数据进行分块处理,或者叫分页处理,我在EF架构里曾经写过类似的,那是在进行BulkInsert时,对大数据批量插入时候用 ...
- EF架构~CodeFirst数据迁移与防数据库删除
回到目录 本文介绍两个概念,防数据库自动删除,这是由于在code first模式下,当数据实体发生变化时,会对原来数据库进行删除,并将新数据表添加进来,但这对于我们的运营环境数据库,是万万不能接受的, ...
随机推荐
- ABP理论学习之模块系统
返回总目录 本篇目录 模块介绍 生命周期事件 模块依赖 自定义模块方法 模块介绍 ABP提供了构建模块并将这些模块组合起来创建应用的基础设施.一个模块可以依赖另一个模块.一般来说,一个程序集可以认为是 ...
- Mina入门实例(一)
mina现在用的很多了,之前也有用到,但是毕竟不熟悉,于是查了一些资料,做了一些总结.看代码是最直观的,比什么长篇大论都要好.不过其中重要的理论,也要理解下. 首先是环境,程序运行需要几个包,这里用m ...
- Sharing A Powerful Tool For Calculate Code Lines
最近正好需要统计下某项目代码行数,然后就找代码行数统计工具.以前找到过一个正则表达式,但是只有在VS2010下有用,VS2012和VS2013下的统计就不好使了. 接着搜索了一下代码行数统计绿色工具免 ...
- [视频],花一分钟来看看Worktile是如何为团队协作而生的
团队协作,我们想的更深.更远.更多,花一分钟来看看我们特别奉献的故事,然后去注册一个账号,邀请小伙伴一起来工作,你会体会Worktile才是真正懂你的协作方式. 我们想做的百年公司还有很多的路,这一站 ...
- WCF 的 Service Instance模式和并发处理
WCF 的 Service Instance(实例)有三种模式 PerCall:每一次调用都创建一个实例,每一次调用结束后回收实例.此模式完全无状态. PerSession:调用者打开Channel时 ...
- MA均线组合
MA5.MA13.MA21.MA34.MA55.MA90.MA120.MA250
- PHP面向对象笔记
一.构造函数.析构函数(1)构造函数:__construct()说明:对象被实例化时调用,可带参数例: $obj = new A($a,$b); (2)析构函数:_destruct()说明:页面执行结 ...
- mysql导入导出sql文件
window下 1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u dbuser -p dbname > dbname.sql2. ...
- Conditional Split component 用法
Conditional Split 用于将数据流按照条件进行拆分,每一个output 都有name和condition. 数据流逐行按照condition进行match,如果match,那么改行会进入 ...
- C#设计模式系列:状态模式(State)
1.状态模式简介 1.1>.定义 状态模式的核心思想是允许一个对象在它的内部状态改变时改变它的行为,即不同的状态对应不同的行为. 状态模式的针对性很强,当有状态变化的时候可以选择状态模式. 1. ...