继上篇文章(EF Core懒人小技巧之拒绝DbSet)之后,最近笔者把这个小功能单独封装成一个扩展方法并开源,欢迎交流和Star~

GitHub: EntityFrameworkCore.Extension.AutoMapping

Nuget:EntityFrameworkCore.Extension.AutoMapping

EntityFrameworkCore.Extension.AutoMapping.Abp

EntityFrameworkCore.Extension.AutoMapping.AbpVNext

如何使用

在DbContext.cs中重写OnModelCreating方法:

using EntityFrameworkCore.Extension;
... //此处省略其它代码
public class XmateDbContext:DbContext
{
... //此处省略其它代码
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
var modelAssemblyName = "XMate.Models";//实体类所在类库的名称,不包含扩展名(.dll)
modelBuilder.AutoMappingEntityTypes<IEntity>(modelAssemblyName);//泛型IEntity为所有实体类的规约类型
base.OnModelCreating(modelBuilder);//这个必须加,否则报错 ...//此处省略其它代码
}
}

这样,我们就可以不用写满屏的DbSet了。

但是,在有的第三方框架中可能就会诞生新的问题。。。

比如在ABP或者VNext框架中,用过ABP框架的都应该知道,ABP是通过扫描DbContext中的DbSet来实现将实体类的仓储自动注册到IOC容器中的,下面我们就需要自己动手来实现:

    public static class AutoRegisterEntityRepositoryExtensions
{
/// <summary>
/// 将数据表实体类型对应的仓储注入到IOC容器
/// </summary>
/// <param name="iocManager"></param>
public static void RegisterDbEntityRepositories<TDbContext>(this IIocManager iocManager, string modelAssemblyName) where TDbContext : DbContext
{
foreach (var entityType in GetDbEntityType(typeof(IEntity<>), modelAssemblyName))
{
var keyType = entityType.GetInterfaces().Where(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEntity<>)).SelectMany(t => t.GetGenericArguments()).First();
var genericRepositoryType = typeof(IRepository<,>).MakeGenericType(entityType, keyType);
var impType = typeof(EfCoreRepositoryBase<,,>).MakeGenericType(typeof(TDbContext), entityType, keyType);
iocManager.RegisterIfNot(genericRepositoryType, impType, lifeStyle: DependencyLifeStyle.Transient);
}
} /// <summary>
/// 获取数据表实体类型列表
/// </summary>
/// <param name="constraintType">实体定义约束类型</param>
/// <param name="modelAssemblyName">实体类所在dll名称,不包含后缀名(.dll)</param>
/// <returns></returns>
private static List<Type> GetDbEntityType(Type constraintType, string modelAssemblyName)
{
var all = AppDomain.CurrentDomain.GetAssemblies();
var types = all.WhereIf(!modelAssemblyName.IsNullOrWhiteSpace(), a => a.FullName.Contains(modelAssemblyName))
.SelectMany(m => m.GetTypes().Where(t => t.IsClass && !t.IsAbstract && (t.IsImplement(constraintType) || t.IsSubclass(constraintType))).ToList())
.Distinct()
.ToList();
return types.Where(t => !t.GetCustomAttributes<NotMappedAttribute>().Any()).ToList();
}
}

注:以上代码摘自:AutoRegisterEntityRepositoryExtensions.cs

在ABP VNext中的实现思路也是如此,这里就不贴代码了,感兴趣的可以查阅源代码

在Abp中实现自动注入实体类对应的Repository

using EntityFrameworkCore.Extension.AutoMapping.Abp;
... //此处省略其它代码
public class XmateModule:AbpModule
{
... //此处省略其它代码
//重写Initialize方法
public override void Initialize()
{
... //此处省略其它代码
var modelAssemblyName = "XMate.Models";//实体类所在类库的名称,不包含扩展名(.dll)
IocManager.RegisterDbEntityRepositories(modelAssemblyName);
}
}

在Abp VNext中实现自动注入实体类对应的Repository

using EntityFrameworkCore.Extension.AutoMapping.AbpVNext;
... //此处省略其它代码
public class XmateModule:AbpModule
{
... //此处省略其它代码
//重写ConfigureServices方法
public override void ConfigureServices(ServiceConfigurationContext context)
{
... //此处省略其它代码
var modelAssemblyName = "XMate.Models";//实体类所在类库的名称,不包含扩展名(.dll)
context.Services.RegisterDbEntityRepositories(modelAssemblyName);
}
}

最新文章

  1. Maven实战:Maven生命周期
  2. jquery 键盘回车事件
  3. Java开发基础
  4. MySQL Fabric 分片性能测试
  5. WampServer 在 httpd.conf 中配置多站点 (IP 配置法:不用每次修改 hosts 文件 + 域名配置法 )
  6. Xcode5创建自己的静态库详解
  7. 用vi修改文件,保存文件时,提示“readonly option is set”的解决方法
  8. Objective-C 【完整OC项目-购票系统-系统分析-代码实现】
  9. Java SE (1)之 JFrame 组件 BorderLayout 布局
  10. bzoj 2324 [ZJOI2011]营救皮卡丘(floyd,费用流)
  11. ubuntu安装体验
  12. java--函数练习
  13. jquery 禁止herf跳转,并执行相应的js代码
  14. 记录WEUI中滚动加载的一个BUG
  15. Kruskal重构树(货车运输)
  16. BZOJ_4590_[Shoi2015]自动刷题机_二分答案
  17. Core官方DI解析(2)-ServiceProvider
  18. 关于Django的网页编写
  19. MFC之几类消息的区别
  20. UNIX高级环境编程(14)文件IO - O_DIRECT和O_SYNC详解 &lt; 海棠花溪 &gt;

热门文章

  1. Web 开发相关概念
  2. 3、StringBuffer类
  3. python基础__十大经典排序算法
  4. 2.1pip的安装和使用
  5. Ceph 有关知识简介
  6. k8s上安装安装 Ingress Controller &amp;卸载
  7. echarts pie饼状图绑定点击事件
  8. cf1082 A. Vasya and Book
  9. 洛谷P3810 陌上花开 (cdq)
  10. numpy中的一些常用的关键字用法