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模式下,当数据实体发生变化时,会对原来数据库进行删除,并将新数据表添加进来,但这对于我们的运营环境数据库,是万万不能接受的, ...
随机推荐
- Nova PhoneGap框架 第九章 控件
我们的框架中也提供了一些常用的控件,这些控件大多都依赖于我们的框架,也正是在我们的框架下才使得实现这些控件的变得更简单.但是我们的框架是不依赖与这些控件的,如果你用不上这些控件,你完全可以把相关的代码 ...
- EF连接PostgreSql
1.用nuget安装npgsql和EF 注意,Nuget一定要安装Npgsql的2.2.7版本,更高版本nuget在后面安装EF的时候无法自动解析. install-Package Npgsql -V ...
- Elasticsearch查询——布尔查询Bool Query
Elasticsearch在2.x版本的时候把filter查询给摘掉了,因此在query dsl里面已经找不到filter query了.其实es并没有完全抛弃filter query,而是它的设计与 ...
- react Props 验证 propTypes,
<body><!-- React 真实 DOM 将会插入到这里 --><div id="example"></div> <!- ...
- WPF入门教程系列十七——WPF中的数据绑定(三)
四. XML数据绑定 这次我们来学习新的绑定知识,XML数据绑定.XmlDataProvider 用来绑定 XML 数据,该XML数据可以是嵌入.Xmal文件的 XmlDataProvider 标记中 ...
- js创建与追加元素
用javascript创建元素 : var NewNode = document.creatElement('div'); 结合appendChild与insertBefore插入到DOM树中 ins ...
- VS中行号对齐的辅助线(虚线)去除
3张图 2 3
- SQL Server Audit监控触发器状态
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 注意事项(Attention) 疑问(Questions) 参 ...
- HTTP的RST包与WinHttp延迟关闭TCP连接
一.RST包也常见于断开TCP连接 几个月前用wireshark抓HTTP包发现有的网络通信在结束的时候没有使用四次握手,而是直接使用RST包.如: 在TCP协议中RST表示复位,用来异常的关闭连接 ...
- 【原创】开源Math.NET基础数学类库使用(06)直接求解线性方程组
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...