nopcommerce mysql_NopCommerce用.net core重写ef

nopcommerce mysql_NopCommerce用.net core重写ef最近看了 NopCommerce 源码 用 core 学习着写了一个项目 修改的地方记录下 项目地址 NopCommerce 框架出来好久了 18 年的第一季度懒加载出来后也会全部移动到 netcore 那么就更好玩了 项目内容模仿部分分层模式引擎机制 DI 容器 EF 仓储模式 Mapping 部分修改 netcore 重写类库 EFcoremysql 动态加载 dbset 当然 NopCommerce 还包含很多特技 P

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

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

项目内容

模仿部分分层模式

引擎机制

DI容器

EF

仓储模式

Mapping

部分修改.net core 重写类库

EFcore mysql 动态加载dbset

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

项目介绍

项目分层

bbf5f381fb012a131693f13b0c2f3bce.png

1、Libraries

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

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

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

2、Presentation

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

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

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

2.项目修改点

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public classDataBaseStartup: ISelfStartup2 {3

4 public voidConfigureServices(IServiceCollection services, IConfigurationRoot configuration)5 {6 services.AddDbContext(x => x.UseMySql(configuration.GetConnectionString(“MySql”)));7 }8

9 public voidConfigure(IApplicationBuilder application)10 {11 var dbContext=EngineContext.Current.ServiceProvider.GetService();12 dbContext.Database.EnsureCreated();13 }14

15 public int Order { get; } = 1;16 }

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public SelfDbContext(DbContextOptions options) : base(options)

{

}protected override voidOnModelCreating(ModelBuilder modelBuilder)

{

modelBuilder.AddEntityConfigurationsFromAssembly(GetType().Assembly);base.OnModelCreating(modelBuilder);

}

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public static classModelBuilderExtenions2 {3 private static IEnumerable GetMappingTypes(thisAssembly 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(thisModelBuilder modelBuilder, Assembly assembly)9 {10 var mappingTypes = assembly.GetMappingTypes(typeof(ISelfEntityMappingConfiguration));11 foreach (var config in mappingTypes.Select(Activator.CreateInstance).Cast())12 {13 config.Map(modelBuilder);14 }15 }16 }

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public classStudentMapping : ISelfEntityMappingConfiguration2 {3 public voidMap(ModelBuilder b)4 {5 b.Entity().ToTable(“Student”)6 .HasKey(p =>p.Id);7

8 b.Entity().Property(p => p.Class).HasMaxLength(50).IsRequired();9 b.Entity().Property(p => p.Name).HasMaxLength(50);10 }11 }

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public interfaceISelfEntityMappingConfiguration2 {3 voidMap(ModelBuilder b);4 }

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public classStudent:BaseEntity2 {3 public string Name { get; set; }4

5 public string Class { get; set; }6 }

View Code

解释:

DataBaseStartup是继承Startup的数据中间件处理类。这里去选择数据库类型和dbcontext,以及数据库初始化。Nopcommerce原先是在install那层判断是否存在数据库json处理数据库初始化,这里简单化了,初始化可以抽象出来再处理。这个类的实现是在web.framwork层。解耦了核心与web层的。这里完全可以自己再重写一个处理类,用来切换数据库等其他操作。

SelfDbContext是数据处理上下文类。以前写的dbcontext处理新增的实体类dbset都是一个一个属性添加,这里是通过反射进行动态加载。相关的方法写在了modelbuilder的扩展方法里面

ModelBuilderExtenions是modelbuilder的构建扩展方法的类。里面介绍如何通过反射查找如要map进入的实体map对象。主要通过对比类型继承的接口对象type

ISelfEntityMappingConfiguration是所有map对象的上层接口,通过这个类的类别判断实体加入到dbcontext

StudentMapping和student类是这里举例的例子。Mapping可以对数据字段进行处理。当然也可以直接在实体类加上attribute。

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

引擎构建。项目中也构建了EngineContext和IEngine。引擎是整个项目启动的处理核心,处理的东西不再复述。发现构建了这个之后 可以切换orm框架了。对于一些大型需要对接第三方同步orm,那么这个构建出来之后就非常好处理了。当然好处的地方还有更多。

仓储模式。这里其实是伪仓储,封装多出一个仓库管理员,并没有事务聚合根等做法。

DI选择auotofac。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231135.html原文链接:https://javaforall.net

(0)
上一篇 2026年1月26日 下午12:01
下一篇 2026年1月26日 下午12:22


相关推荐

  • 关于repeater的ItemDataBound事件

    关于repeater的ItemDataBound事件前台代码:             onitemcommand=”rptOrderList_ItemCommand”            onitemdatabound=”rptOrderList_ItemDataBound”>

    2022年10月9日
    4
  • IntelliJ IDEA快速入门 | 第三篇:彻底卸载IntelliJ IDEA

    IntelliJ IDEA快速入门 | 第三篇:彻底卸载IntelliJ IDEA写在前面之前,笔者在自己本机上就已经安装过了一个IntelliJIDEA,只不过其版本是2019.1.3,在桌面上的快捷方式如下图所示。而且之前我也已经将其激活成功教程了,就是网上找的方案来进行激活成功教程的,激活成功教程之后确实能用,不过由于那个时候我还在用Eclipse做Java后端开发,所以一直都没用IntelliJIDEA,不知道过了多长时间,打开它发现已过试用期,MD,老子不是已经激活成功教程过了吗,而且好像还能用到2099年,就这,就这,就这,就这就不能用了????各位看官老爷们,今天是2021年3月23日,下午1

    2022年6月17日
    84
  • prototype.js中的class.create()方法

    prototype.js中的class.create()方法Class.createClass.create([superclass][,methods…])→Classsuperclass (Class) –Theoptionalsuperclasstoinheritmethodsfrom.methods (Object) –Anobjectwhosepropertiesw

    2022年7月22日
    21
  • 批处理for命令的用法_批处理for命令详解

    批处理for命令的用法_批处理for命令详解for/?1.对一组文件中的每一个文件执行某个特定命令。for%variablein(set)docommand[command-parameters]for%%variablein(set)docommand [command-parameters]%variable指定一个单一字母可替换的参数。set表示字符串或变量,当表示多个变量时,中间可以,空格等隔开…

    2025年11月10日
    6
  • 豆包1.6模型震撼升级!实测效果解析与AI云原生Agent开发示例,不容错过!

    豆包1.6模型震撼升级!实测效果解析与AI云原生Agent开发示例,不容错过!

    2026年3月12日
    1
  • “权限”用英语该用哪个?

    “权限”用英语该用哪个?权限 是我们设计系统必不可少的 关于 权限 的英语单词也很多 该用哪个呢 我参照有关 权限 的英文软件 总结如下 不足之处 多多指正 Permission 权限 包括动作和客体 比如 添加文档 添加 是动作 文档 是客体 相近的也有 AccessContro Privilege 权力 在 Permission 的基础上加一个主体 比如 小张可以添加文档 多了个主体小张 相近的也有

    2026年3月17日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号