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声明的实例,就是以异步的方式实现操作。

时间: 2024-11-07 18:33:08

EF异步改造之路~第一回 仓储接口的改造的相关文章

EF架构~EF异步改造之路~仓储接口的改造~续

回到目录 在写完仓储接口的改造改造后,总觉得有个代码的坏味道,这种味道源于它的DRP,即重复的代码太多了,即异步操作和同步操作其实只是在insert,update和delete上有所不同,获取数据的方法都是一样的,所以,我最后决定,将异步的接口进行改造,让它更加合理,方法后都加上Async的后缀,看上去也更像是个异步方法,呵. 改造后的异步接口 /// <summary> /// 异步操作 /// 基础的数据操作规范 /// 与ORM架构无关 /// </summary> ///

EF异步改造之路~第二回 让DbContextRepository去实现异步接口

上一讲中,我们定义了三个异步操作接口,这回我们将对它进行实现,而有一个基础知识需要大家清楚,那就是实现接口的方式,一般我们使用默认的方式(隐式实现),这种方法实现的接口方式均为public,即它可以脱离接口,而直接通过类对象去访问,而当一个类继承多个接口,而这些接口中都有相同的方法时,我们就需要显示实现接口了,显示实现的接口成员只能通过接口实例去访问它,今天我们对DbContextRepository的改造就用到了这个特性. 基本关键字 async:用来标识这个方法为异步方法 await:用在异

七日Python之路--第一天

网上的资源师丰富的.但难免有些过时的信息,比如我现在使用的是去年下载的python3.3,而网上多数都是Python2.7. 差别比较大的就是:①读取用户输入raw_input()已经不能使用,只能使用input().②文件读取file()也不能使用了,被替换成了open(). 入门教材算是看的<简明Python教程>:地址 http://sebug.net/paper/python/index.html 一共16个章节,大约两个小时看完.这样算是入门了吧. 由于之前研究Java方向是WEB方

程序演义第一回哥伦布水杯戏权贵

2.1第一回 哥伦布水杯戏权贵,阿兰煮酒论编程 第一回介绍的故事是关于航海家哥伦布的,本质上只说了一件事:什么是程序? 程序是怎么回事,和哥伦布又有什么关系呢?说简单很简单,用两个杯子比划一下就有了.故事还要从很久以前说起,1492年10月12日,哥伦布(Christopher Columbus)发现了新大陆--美洲大陆,他是发现美洲的第一人:同样的,在电脑世界中也有许多第一,那问一个最简单的问题:第一个程序是谁发明的呢?对于这个问题,现在很难考证.但经阿兰论证,程序和哥伦布有一定的关系,不信,

黑客之路第一期笔记

黑客攻击的常用手段 口令猜解攻击 恶意代码攻击 缓冲区溢出攻击 网络欺骗攻击 网站功防 阻塞攻击 文件上传漏洞攻击 跨站脚步攻击 弱密码攻击 网络旁注攻击 后门分类 账号后门 漏洞后门 系统服务后门 木马后门 黑客之路第一期笔记

[你必须知道的.NET]第一回:恩怨情仇:is和as

本文将介绍以下内 容: • 类型转换 • is/as操作符小议 1. 引言 类型安全是.NET设计之初重点考虑 的内容之一,对于程序设计者来说,完全把握系统数据的类型安全,经常是力不从心的问题.现在,这一切已经在微软大牛们的设计框架中为你解决了.在.NET 中,一切类型都必须集成自 System.Object类型,因此我们可以很容易的获得对象的准确类型,方法是:GetType()方法.那么.NET中的类型转换,应该考虑的地方 有那些呢? 2. 概 念引入 类型转换包括显示 转换和隐式转换,在.N

Volley使用指南第一回(来自developer.android)

最近闲来想看看android网络方面的东西.google在2013年发布了一个叫做Volley的网络请求框架,我看了一下官网,居然在training里面就有教程.首先,英文的东西看着 还是挺不爽的,特此翻译一下,正好自己也学习一下, 可能最后有时间也会去研究一下它的源码是怎么写的.下面开始: 第一回:发送一个简单的请求 当你用Volley的时候,你的流程分为几步: 1.你会创建一个RequestQueue并且传给它一个Request对象. 2.之后这个RequestQueue就会组织一些工作线程

Jquery真的不难~第一回 编程基础知识

Jquery真的不难~第一回 编程基础知识 回到目录 前言 说Jquery之前,先来学习一下Javascript(以后简称为JS)语言中的基础知识问题,其时对于每种编程语言来说基础知识都是大同小异的,对变量,函数,条件语句块,循环语句块等等,而对于每种语言在写法上到是显得各有不同,如JS里在定义变量时,你要用var去声局部变量的声明,而对于弱类型的语言JS来说,你也可以不加var,但不加它会认为这个变量为全局变量,这是要注意的. 变量 在程序运行过程中,其值可以发生改变的(呵呵,10多年前书上的

Linux中的lo回环接口详细介绍

1.linux的网络接口之扫盲 (1)网络接口的命名 这里并不存在一定的命名规范,但网络接口名字的定义一般都是要有意义的.例如: eth0: ethernet的简写,一般用于以太网接口. wifi0:wifi是无线局域网,因此wifi0一般指无线网络接口. ath0: Atheros的简写,一般指Atheros芯片所包含的无线网络接口. lo: local的简写,一般指本地环回接口. (2)网络接口如何工作 网络接口是用来发送和接受数据包的基本设备. 系统中的所有网络接口组成一个链状结构,应用层