最近看了NopCommerce源码,用core学习着写了一个项目,修改的地方记录下。项目地址

NopCommerce框架出来好久了。18年的第一季度 懒加载出来后也会全部移动到.net core。那么就更好玩了。


  项目内容

  1. 模仿部分

    1. 分层模式
    2. 引擎机制
    3. DI容器
    4. EF
    5. 仓储模式
    6. Mapping
  2. 部分修改
    1. .net core 重写类库
    2. EFcore mysql 动态加载dbset

当然NopCommerce还包含很多特技:Plugin,Seo,订阅发布,theme切换等等。这些后期再维护进去。


项目介绍

  1. 项目分层

    

  1. 1、Libraries

        Nop.Core:【核心层】基础设施,例:领域对象,仓库接口,引擎接口,DI管理接口,反射,公共方法。

        Nop.Data:【数据层】EF相关,dbcontext,仓储实现,mapping

        Nop.Services:【服务层】数据逻辑处理由这层提供。

  1. 2、Presentation

        Nop.Web:【页面层】展示界面。

        Nop.Web.Framework:【页面基础层】web层的上层封装。例如启动项的实现,DI实现。

详细的分层思想和细节这里不再复述。

    2.项目修改点

  EF6转换到EFCore,数据库选择mysql,动态加载dbset 看了相关代码,在进行解释    

 1     public class DataBaseStartup: ISelfStartup
 2     {
 3
 4         public void ConfigureServices(IServiceCollection services, IConfigurationRoot configuration)
 5         {
 6             services.AddDbContext<SelfDbContext>(x => x.UseMySql(configuration.GetConnectionString("MySql")));
 7         }
 8
 9         public void Configure(IApplicationBuilder application)
10         {
11             var dbContext=EngineContext.Current.ServiceProvider.GetService<SelfDbContext>();
12             dbContext.Database.EnsureCreated();
13         }
14
15         public int Order { get; } = 1;
16     }

View Code

    public SelfDbContext(DbContextOptions options) : base(options){}protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.AddEntityConfigurationsFromAssembly(GetType().Assembly);base.OnModelCreating(modelBuilder);}

View Code

 1     public static class ModelBuilderExtenions
 2     {
 3         private static IEnumerable<Type> GetMappingTypes(this Assembly assembly, Type mappingInterface)
 4         {
 5             return assembly.GetTypes().Where(x => !x.IsAbstract && !x.IsGenericType && !x.IsInterface && x.GetInterfaces().Any(y => y == mappingInterface));
 6         }
 7
 8         public static void AddEntityConfigurationsFromAssembly(this ModelBuilder modelBuilder, Assembly assembly)
 9         {
10             var mappingTypes = assembly.GetMappingTypes(typeof(ISelfEntityMappingConfiguration));
11             foreach (var config in mappingTypes.Select(Activator.CreateInstance).Cast<ISelfEntityMappingConfiguration>())
12             {
13                 config.Map(modelBuilder);
14             }
15         }
16     }

View Code

 1     public  class StudentMapping : ISelfEntityMappingConfiguration
 2     {
 3         public void Map(ModelBuilder b)
 4         {
 5             b.Entity<Student>().ToTable("Student")
 6                 .HasKey(p => p.Id);
 7
 8             b.Entity<Student>().Property(p => p.Class).HasMaxLength(50).IsRequired();
 9             b.Entity<Student>().Property(p => p.Name).HasMaxLength(50);
10         }
11     }

View Code

1     public interface ISelfEntityMappingConfiguration
2     {
3         void Map(ModelBuilder b);
4     }

View Code

1     public class Student:BaseEntity
2     {
3         public string Name { get; set; }
4
5         public string Class { get; set; }
6     }

View Code

      解释:

  1. DataBaseStartup是继承Startup的数据中间件处理类。这里去选择数据库类型和dbcontext,以及数据库初始化。Nopcommerce原先是在install那层判断是否存在数据库json处理数据库初始化,这里简单化了,初始化可以抽象出来再处理。这个类的实现是在web.framwork层。解耦了核心与web层的。这里完全可以自己再重写一个处理类,用来切换数据库等其他操作。
  2. SelfDbContext是数据处理上下文类。以前写的dbcontext处理新增的实体类dbset都是一个一个属性添加,这里是通过反射进行动态加载。相关的方法写在了modelbuilder的扩展方法里面
  3. ModelBuilderExtenions是modelbuilder的构建扩展方法的类。里面介绍如何通过反射查找如要map进入的实体map对象。主要通过对比类型继承的接口对象type
  4. ISelfEntityMappingConfiguration是所有map对象的上层接口,通过这个类的类别判断实体加入到dbcontext
  5. StudentMapping和student类是这里举例的例子。Mapping可以对数据字段进行处理。当然也可以直接在实体类加上attribute。

    3.项目继承nopcommerce的其他地方

  1. 引擎构建。项目中也构建了EngineContext和IEngine。引擎是整个项目启动的处理核心,处理的东西不再复述。发现构建了这个之后 可以切换orm框架了。对于一些大型需要对接第三方同步orm,那么这个构建出来之后就非常好处理了。当然好处的地方还有更多。
  2. 仓储模式。这里其实是伪仓储,封装多出一个仓库管理员,并没有事务聚合根等做法。
  3. DI选择auotofac。

转载于:https://www.cnblogs.com/TeemoHQ/p/8343731.html

NopCommerce用.net core重写ef相关推荐

  1. .Net Core 使用EF Core codefirst模式

    .Net Core 使用EF Core codefirst模式 什么是codefirst模式 EF Core有两种数据库设计模式,DBfirst 数据库优先.Codefirst 代码优先. 1.我们一 ...

  2. ASP.NET Core重写个人博客站点小结

    今天用ASP.NET Core重写了个人博客站点,原来是基于ASP.NET 4.5开发的.重写工作总体很顺利,最后成功发布到Ubunt+Nginx平台上.效果如下: 右边的Header信息里可以看到已 ...

  3. Asp.net Core 添加 EF 工具并执行初始迁移错误解决方法(Add-Migration Initial---Build failed.)

    Asp.net Core 添加 EF 工具并执行初始迁移错误解决方法(Add-Migration Initial---Build failed.) 参考文章: (1)Asp.net Core 添加 E ...

  4. ASP.NET Core 和 EF Core系列教程——CRUD

    ASP.NET Core 和 EF Core系列教程--CRUD (2 / 10) CRUD 为创建.读取.更新.删除的英文首字母的缩写 作者:Tom Dykstra和Rick Anderson Co ...

  5. 【ASP.NET Core】EF Core 模型与数据库的创建

    大家好,欢迎收看由土星卫视直播的大型综艺节目--老周吹逼逼. 今天咱们吹一下 EF Core 有关的话题.先说说模型和数据库是怎么建起来的,说装逼一点,就是我们常说的 "code first ...

  6. .NET Core使用EF分页查询数据报错:OFFSET语法错误问题

    在Asp.Net Core MVC项目中使用EF分页查询数据时遇到一个比较麻烦的问题,系统会报如下错误: 分页查询代码: 1 var newQuery = query.Skip((condition. ...

  7. ASP.NET Core MVC+EF Core从开发到部署

    笔记本电脑装了双系统(Windows 10和Ubuntu16.04)快半年了,平时有时间就喜欢切换到Ubuntu系统下耍耍Linux,熟悉熟悉Linux命令.Shell脚本以及Linux下的各种应用的 ...

  8. 一步步学习EF Core(3.EF Core2.0路线图)

    前言 这几天一直在研究EF Core的官方文档,暂时没有发现什么比较新的和EF6.x差距比较大的东西.不过我倒是发现了EF Core的路线图更新了,下面我们就来看看 今天我们来看看最新的EF Core ...

  9. ef mysql db first_Net Core使用EF之DB First

    一.新建一个.net core的MVC项目 新建好项目后,不能像以前一样直接在新建项中添加ef了,需要用命令在添加ef的依赖 二.使用Nuget添加EF的依赖 输入命令:  Install-Packa ...

最新文章

  1. jQuery之事件绑定
  2. LeetCode() Largest Number
  3. python 网络编程 socket 报错 ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。
  4. 移动端网页特效:左右滑动开关
  5. 2.3.3 操作系统之实现临界区进程互斥的硬件实现方法
  6. vs为什么打了断点不断_为什么西餐厅里的牛排又嫩又多汁?原来大厨都做了“这一步”...
  7. 生产环境遇到难题,你是如何解决的?
  8. CANOpen网络管理报文
  9. python 数据分析 实际案例_python在实际工作中运用的案例
  10. 同盾科技声纹识别建模大赛
  11. matlab采样率为100hz,matlab自己设计一个低通滤波器,要求滤出100Hz之外的频率,采样率为10000Hz...
  12. 小米路由硬盘版搭建ftp服务和博客
  13. 软件工程复习知识点汇总(2)
  14. 什么是社会资源?为什么有人会鄙视程序员没有社会资源?
  15. 开放原子训练营(第一季)铜锁探密,SM3杂凑算法加强至pro版
  16. python 图像清晰度_图像清晰度评价指标(Python)
  17. matlab里面的simu,matlab_commu_sim
  18. 解决QGIS中GEE插件授权问题
  19. mac 爱普生打印机驱动_适用于 Mac 的打印机和扫描仪驱动程序
  20. linux 视频无法播放视频教程,Ubuntu7.10下无法正常播放网页上Flash视频的解决

热门文章

  1. hsv白色h值是多少_ShaderToy系列:HSV
  2. python爬取微博评论_用 python 爬取微博评论并手动分词制作词云
  3. android menu菜单 实现点击后不消失_教你修改Windows万年不变的黄色文件夹,让文件也不枯燥...
  4. 关于Keras在测试不能使用正则dropout的解决
  5. 高可用Eureka注册中心配置说明(双机部署)
  6. (理论)数据库建模三步骤:概念模型-逻辑模型-物理模型
  7. ext4文件系统的delalloc选项造成单次写延迟增加的分析
  8. 部署和调优 3.4 腾讯企业邮箱免费版 未完
  9. oracle维护常用SQL语句(查看系统表和视图)
  10. Linux文件系统中的链接