借助 WeihanLi.EntityFramework 实现简单的 Repository

Intro

很多时候一些简单的业务都是简单的增删改查,动态生成一些代码完成基本的增删改查,而这些增删改查代码大多类似,只有一些有复杂业务逻辑的可能需要手动去写。于是实现了一个基于 EF Core 的 Repository。

GetStarted

0. 添加包引用

在项目里增加对 WeihanLi.EntityFramework 的引用

dotnet add package WeihanLi.EntityFramework

来看个使用例子:

使用方式:

1. 不需要定义自己的Repository,默认使用泛型的Repository

  1. // 注册 EFREpository

  2. services.AddEFRepostory();

  3. // 在需要的地方使用,直接获取一个 `IEFRepository<TestDbContext, TestEntity>` 服务

  4. DependencyResolver.Current.TryInvokeService<IEFRepository<TestDbContext, TestEntity>>(repo =>

  5. {

  6. repo.Update(new TestEntity

  7. {

  8. CreatedAt = DateTime.UtcNow,

  9. Extra = new { Name = "Abcde", Count = 4 }.ToJson(),

  10. Id = 3

  11. }, t => t.CreatedAt, t => t.Extra);

  12. repo.Insert(new[]

  13. {

  14. new TestEntity

  15. {

  16. Extra = new {Name = "Abcdes"}.ToJson(),

  17. CreatedAt = DateTime.Now

  18. },

  19. new TestEntity

  20. {

  21. Extra = new {Name = "Abcdes"}.ToJson(),

  22. CreatedAt = DateTime.Now

  23. }

  24. });

  25. var list = repo.GetAll().Select(_ => _.Id).ToArray();

  26. Console.WriteLine($"Ids: {list.StringJoin(",")}");

  27. repo.Get(_ => _.Id, queryBuilder => queryBuilder

  28. .WithOrderBy(q => q.OrderByDescending(_ => _.Id)));

  29. var lastItem = repo.FirstOrDefault(queryBuilder => queryBuilder

  30. .WithOrderBy(q => q.OrderByDescending(_ => _.Id)));

  31. var list1 = repo.Get(x => x.Id, queryBuilder => queryBuilder

  32. .WithOrderBy(query => query.OrderByDescending(q => q.Id))

  33. );

  34. repo.Delete(t => DbFunctions.JsonValue(t.Extra, "$.Name") == "Abcdes");

  35. Console.WriteLine($"Count: {repo.Count()}");

  36. });

2. 生成自己的 Repository 代码

你可以生成自己的 基于 默认的 Repository 的代码,默认的 Repository 的所有方法都是虚方法,可以重写也可以,默认会生成接口和类,如果不要生成接口可以配置 EFRepositoryGeneratorOptions

  1. // 配置不生成接口

  2. services.Configure<EFRepositoryGeneratorOptions>(options=>options.GenerateInterface=false);

  3. // 配置生成的 Repository 类型名称, 默认是 EntityName+"Repository",可以通过 RepositoryNameResolver 自定义

  4. services.Configure<EFRepositoryGeneratorOptions>(options=>options.RepositoryNameResolver = entityName=> $"{entityName}Service");

默认生成的代码类似于这样子:

  1. using WeihanLi.EntityFramework;

  2. using WeihanLi.EntityFramework.Samples;

  3. namespace WeihanLi.EntityFramework.Samples.Business

  4. {

  5. public partial interface ITestEntityRepository : IEFRepository<TestDbContext, TestEntity> { }

  6. public partial class TestEntityRepository : EFRepository<TestDbContext, TestEntity>, ITestEntityRepository

  7. {

  8. public TestEntityRepository(TestDbContext dbContext) : base(dbContext) { }

  9. }

  10. }

如果对生成的代码内容部分要修改,可以自定义自己的 IEFRepositoryGenerator,然后 services.AddSingleton<IEFRepositoryGenerator,CustomEFRepositoryGenerator>() 覆盖掉默认的就可以了,或者可以 Replace 直接替换也是可以的~

调用下面的代码去生成代码:

  1. DependencyResolver.Current.ResolveService<IEFRepositoryGenerator>()

  2. .GenerateRepositoryCodeFor<TestDbContext>("WeihanLi.EntityFramework.Samples.Business");

QueryBuilder 使用

为 EF 添加了 FluentAPI 的 QueryBuilder 支持,使得可以更方便的进行数据查询。

默认的 QueryBuilder 会 AsNoTracking(),如果不要 AsNoTracking可以使用 WithNoTracking(false) 来设置,EFCore 新增了一个 QueryFilter 可以全局过滤,默认查询也是启动全局过滤的,如果要在查询中禁用这个全局过滤可以通过 IgnoreQueryFilters() 来设置。

基本方法:

  1. EFRepositoryQueryBuilder<TEntity> WithPredict(Expression<Func<TEntity, bool>> predict);// 设置查询条件

  2. EFRepositoryQueryBuilder<TEntity> WithOrderBy(Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderByExpression); // 设置排序

  3. EFRepositoryQueryBuilder<TEntity> WithNoTracking(bool noTracking = true); // 设置是否 Tracking

  4. EFRepositoryQueryBuilder<TEntity> IgnoreQueryFilters(bool ignoreQueryFilters = true);// 是否忽略查询

  5. EFRepositoryQueryBuilder<TEntity> WithInclude(Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include); // 设置 include

  6. EFRepositoryQueryBuilder<TEntity> WithCount(int count);// 如果要查 Top N 的时候可以设置

使用示例如下:

  1. var repository = serviceProvider.GetService<IEFRepository<TestDbContext, TestEntity>>();

  2. // query lastItem

  3. var lastItem = repo.FirstOrDefault(queryBuilder => queryBuilder

  4. .WithOrderBy(q => q.OrderByDescending(_ => _.Id)));

  5. // query id list orderBy id desending

  6. var idList = repo.Get(x => x.Id, queryBuilder => queryBuilder

  7. .WithOrderBy(query => query.OrderByDescending(q => q.Id))

  8. );

  9. var blockList = serviceProvider.GetService<IEFRepository<TestDbContext, BlockEntity>>().GetPagedList(queryBuilder => queryBuilder

  10. .WithPredict(whereLambda)

  11. .WithInclude(q => q.Include(b => b.BlockType))

  12. .WithOrderBy(q => q.OrderByDescending(b => b.BlockTime)), search.PageIndex, search.PageSize);

  13. //load data

  14. var list = _reservationBLL.GetPagedList(queryBuilder => queryBuilder

  15. .WithPredict(whereLambda)

  16. .WithOrderBy(query => query.OrderByDescending(r => r.ReservationForDate).ThenByDescending(r => r.ReservationTime))

  17. .WithInclude(query => query.Include(r => r.Place))

  18. , search.PageIndex, search.PageSize);

Reference

  • https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation/Controllers/HomeController.cs#L43

  • https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation.AdminLogic/Controllers/BlockEntityController.cs#L39

  • https://github.com/WeihanLi/WeihanLi.EntityFramework/blob/dev/samples/WeihanLi.EntityFramework.Samples/Program.cs


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 

基于 EntityFramework 生成 Repository 模式代码相关推荐

  1. 基于python3写的源码剖析_基于python3生成标签云代码解析

    这篇文章主要介绍了基于python3生成标签云代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 标签云是现在大数据里面最喜欢使用的一种展现方式 ...

  2. Intellij idea generate builder 插件-用于自动生成builder模式代码

    2019独角兽企业重金招聘Python工程师标准>>> 目的:开发中喜欢builder模式去构造一个实例,而当一个对象的属性过多的时候,手动的去完成一个类的builder是很繁琐的: ...

  3. 闲鱼代码Java_面向未来的黑科技——UI2CODE闲鱼基于图片生成跨端代码

    作者:闲鱼技术-青页 一直以来, 如何从'视觉稿'精确的还原出 对应的UI侧代码 一直是端侧开发同学工作里消耗比较大的部分,一方面这部分的工作 比较确定缺少技术深度,另一方面视觉设计师也需要投入大量的 ...

  4. 分享基于EF6、Unitwork、Autofac的Repository模式设计

    目录 分享基于EF6.Unitwork.Autofac的Repository模式设计 一.实现的思路和结构图 二.Repository设计具体的实现代码 三.Repository设计的具体的使用 四. ...

  5. java wed登录面 代码_JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)...

    下面通过通过图文并茂的方式给大家介绍JavaWeb实现用户登录注册功能实例代码,一起看看吧. 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBea ...

  6. 用java写ods系统_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo是基于数据库的代码自动生成工具,低代码编程技术的实现,可以零代码自动生成SpringBoot项目工程.生成JavaBean.生成前后端分离的CRUD代码.生成MyBaits的Mapper ...

  7. java生成iso9660工具_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo_20210212 v7.0.0 正式版发布,此次版本更新如下: 1.新增对DB2数据库的支持 2.新增按字段生成文件,支持把字段.JSON.XML数据转换成任何代码 3.新增大量新的自 ...

  8. 基于OpenAPI Specification自动生成Android客户端代码

    OpenAPI Specification(OAS) 无论你从事前端开发还是后端开发,或多或少都听说过Swagger. Swagger Specification 是一种 API Specificat ...

  9. 基于wsimport生成代码的客户端

    概述 wsimport是jdk自带的命令,可以根据wsdl文档生成客户端中间代码,基于生成的代码编写客户端,可以省很多麻烦. wsimport命令 wsimport的用法 wsimport [opti ...

最新文章

  1. MyEclipse+Tomcat+MAVEN+SVN项目完整环境搭建
  2. Python 把OpenCV 获取的图像传递到C
  3. 网工路由基础(6)BGP协议
  4. mysql导入sql文件
  5. 开源项目工时系统_SpringBoot 微信点餐开源系统!综合运用项目,值得一看!
  6. html绑定按键图片移动,如何使用JS实现用键盘控制图片移动呢?
  7. ZooKeeper JMX
  8. 大数据技术周报第 002 期
  9. oracle 查看主外键约束
  10. android pdf阅读工具,Android手机上最好用的PDF阅读器,没有之一!
  11. 刘海洋《Latex入门》学习笔记1
  12. java机甲类回合制游戏,课内资源 - 基于java的RPG回合制游戏
  13. 采集51job职位数量画图后发邮件
  14. crfclust.bdb文件过大处理
  15. 鸿蒙HarmonyOS,真的来了!
  16. 应用Scratchbox构建基于CF卡的嵌入式Linux系统
  17. 网上流传房地产崩盘时间表 楼市重蹈日本覆辙 - 新闻中心 - 搜狐焦点网
  18. anbox 使用情况_Anbox是什么
  19. KVM虚拟化介绍和安装使用方法
  20. 程序员的国庆大阅兵,太好好好好好好看了吧 ……

热门文章

  1. windows7黑屏修复_如何在Windows 10更新后修复黑屏
  2. pcu tps_Mac版Microsoft Office 2011重新定义您的TPS报告体验
  3. ubuntu自定义菜单_如何自定义Ubuntu的每日消息
  4. 全量更新和增量更新_增量BIOS更新或直接更新到最新版本哪个更好?
  5. 阿里云大学课程学习有奖征文活动现在开始
  6. 拒绝“高冷”词汇!初学C#中的委托
  7. PostgreSQL 统计信息pg_statistic格式及导入导出dump_stat - 兼容Oracle
  8. Redhat 5.1 install PHP 5.3.6
  9. Codeforces Round #330 (Div. 2) B. Pasha and Phone 容斥定理
  10. 详解Oracle DELETE和TRUNCATE 的区别