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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • RPC接口设计_java rpc项目

    RPC接口设计_java rpc项目写在前边分布式架构是互联网应用的基础架构,很多新人入职以来就开始负责编写和调用阿里的各种远程接口。但如同结婚一般,用对一个正确的接口就如同嫁一个正确的人一样,往往难以那么顺利的实现,或多或少大家都会在这个上边吃亏。每年双十一系统调用复盘的时候,我都会听到以下声音你们调我的接口报错了竟然不会自己重试?我的返回值应该从这里取我返回isSuccess()==true,不代表业务成功,你…

    2022年10月13日
    5
  • 实体-联系图(ER图)_实体关系图

    实体-联系图(ER图)_实体关系图我们通常用实体、联系和属性这三个概念来理解现实问题,因此ER模型比较接近人的思维方式。此外,ER模型用简单的图形符号表达系统分析员对问题域的理解,不熟悉计算机技术的用户也能理解它,因此,ER模型可以作为用户与分析员之间有效的交流工具。一、ER模型ER模型中包含3种相互关联的信息:数据对象、数据对象的属性及数据对象彼此之间相互连接的关系。1.数据对象数据对象是对软件必须理解的复合信息…

    2025年11月23日
    4
  • Android Hook 机制之简单实战[通俗易懂]

    Android Hook 机制之简单实战[通俗易懂]简介什么是HookHook又叫“钩子”,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行融入。这样当这些方法被调用时,也就可以执行我们自己的代码,这也是面向切面编程的思想(AOP)。Hook分类1.根据Android开发模式,Native模式(C/C++)和Java模式(Java)区分,在Android平台上Java层级的Hook;…

    2022年6月4日
    54
  • 忘记密码?不存在的, 教你如何使用python 暴力破解

    忘记密码?不存在的, 教你如何使用python 暴力破解

    2021年9月18日
    64
  • 【LeetCode】【Python解读】Container with most water

    【LeetCode】【Python解读】Container with most water

    2022年1月4日
    51
  • Mongo第三个参数的用法

    Mongo第三个参数的用法

    2021年9月2日
    55

发表回复

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

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