最近看了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 看了相关代码,在进行解释    

     public class DataBaseStartup: ISelfStartup
{ public void ConfigureServices(IServiceCollection services, IConfigurationRoot configuration)
{
services.AddDbContext<SelfDbContext>(x => x.UseMySql(configuration.GetConnectionString("MySql")));
} public void Configure(IApplicationBuilder application)
{
var dbContext=EngineContext.Current.ServiceProvider.GetService<SelfDbContext>();
dbContext.Database.EnsureCreated();
} public int Order { get; } = ;
}
    public SelfDbContext(DbContextOptions options) : base(options)
{ }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.AddEntityConfigurationsFromAssembly(GetType().Assembly);
base.OnModelCreating(modelBuilder);
}
     public static class ModelBuilderExtenions
{
private static IEnumerable<Type> GetMappingTypes(this Assembly assembly, Type mappingInterface)
{
return assembly.GetTypes().Where(x => !x.IsAbstract && !x.IsGenericType && !x.IsInterface && x.GetInterfaces().Any(y => y == mappingInterface));
} public static void AddEntityConfigurationsFromAssembly(this ModelBuilder modelBuilder, Assembly assembly)
{
var mappingTypes = assembly.GetMappingTypes(typeof(ISelfEntityMappingConfiguration));
foreach (var config in mappingTypes.Select(Activator.CreateInstance).Cast<ISelfEntityMappingConfiguration>())
{
config.Map(modelBuilder);
}
}
}
     public  class StudentMapping : ISelfEntityMappingConfiguration
{
public void Map(ModelBuilder b)
{
b.Entity<Student>().ToTable("Student")
.HasKey(p => p.Id); b.Entity<Student>().Property(p => p.Class).HasMaxLength().IsRequired();
b.Entity<Student>().Property(p => p.Name).HasMaxLength();
}
}
     public interface ISelfEntityMappingConfiguration
{
void Map(ModelBuilder b);
}
     public class Student:BaseEntity
{
public string Name { get; set; } public string Class { get; set; }
}

      解释:

    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。

NopCommerce用core重写ef的更多相关文章

  1. NopCommerce用.net core重写ef

    最近看了NopCommerce源码,用core学习着写了一个项目,修改的地方记录下.项目地址 NopCommerce框架出来好久了.18年的第一季度 懒加载出来后也会全部移动到.net core.那么 ...

  2. 【ASP.NET Core】EF Core - “影子属性” 深入浅出经典面试题:从浏览器中输入URL到页面加载发生了什么 - Part 1

    [ASP.NET Core]EF Core - “影子属性”   有朋友说老周近来博客更新较慢,确实有些慢,因为有些 bug 要研究,另外就是老周把部分内容转到直播上面,所以写博客的内容减少了一点. ...

  3. .NET Core、EF、Dapper、MySQL 多种方式实现数据库操作(动态注册实体类)

    目录 前言 一.技术选型 二.遇到的坑 2.1..NET Core 下 EF 的问题 2.2.数据库实体类的注册 切记坑 前言 最近在学习.研究 .NET Core 方面的知识,动手搭建了一些小的 D ...

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

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

  5. net Core 通过 Ef Core 访问、管理Mysql

    net Core 通过 Ef Core 访问.管理Mysql 本文地址:http://www.cnblogs.com/likeli/p/5910524.html 环境 dotnet Core版本:1. ...

  6. asp.net core + mysql + ef core + linux

    asp.net core + mysql + ef core + linux 以前开发网站是针对windows平台,在iis上部署.由于这次需求的目标服务器是linux系统,就尝试用跨平台的.NET ...

  7. Entity Framework Core(EF Core) 最简单的入门示例

    目录 概述 基于 .NET Core 的 EF Core 入门 创建新项目 更改当前目录 安装 Entity Framework Core 创建模型 创建数据库 使用模型 基于 ASP.NET Cor ...

  8. .net core webapi+EF Core

    .net core webapi+EF Core 一.描述: EF Core必须下载.net core2.0版本 Micorsoft.EntityFrameworkCore:EF框架的核心包Micor ...

  9. 一个官翻教程集合:ASP.NET Core 和 EF Core 系列教程

    通过一个大学课程案例讲解了复杂实体的创建过程及讲解 1.ASP.NET Core 和 Entity Framework Core 系列教程——入门 (1 / 10) 2.ASP.NET Core 和 ...

随机推荐

  1. 【深度学习系列】一起来参加百度 PaddlePaddle AI 大赛吧!

    写这个系列写了两个月了,对paddlepaddle的使用和越来越熟悉,不过一直没找到合适的应用场景.最近百度搞了个AI大赛,据说有四个赛题,现在是第一个----综艺节目精彩片段预测 ,大家可以去检测一 ...

  2. MongoDB数据库详解

    第1章 数据库管理系统 1.1 前言 01.数据的定义:文字.图像.地理位置信息(坐标.经纬度)等 02.数据库管理系统的定义:建立.存取和管理数据,保证数据安全和完整性的软件 03.常见的数据库管理 ...

  3. Webpack 2 视频教程 016 - Webpack 2 中生成 SourceMaps

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  4. JDK并发包常用的知识图

    并发包需要注意的知识点 集合类的体系结构

  5. mysql 的 fiter push down 优化

    出处:黑洞中的奇点 的博客 http://www.cnblogs.com/kelvin19840813/ 您的支持是对博主最大的鼓励,感谢您的认真阅读.本文版权归作者所有,欢迎转载,但请保留该声明. ...

  6. windows10合并分区

    删除无用分区 将分区D合并到分区C,"计算机"---右键"管理"--"磁盘管理" 点击分区名,右键选择删除卷,如果有数据,提前备份 扩展分区 ...

  7. SqlServer Partition 分区表

    分区表     测试版本:        Microsoft SQL Server 2014 - 12.0.2000.8 (X64)     Feb 20 2014 20:04:26     Copy ...

  8. robotframework的学习笔记(十四)------学习Robot Framework必须掌握的库—-BuiltIn库

    作为一门表格语言,为了保持简单的结构,RF没有像别的高级语言那样提供类似if else while等内置关键字来实现各种逻辑功能,而是提供给了用户BuiltIn库.如果用户想在测试用例中实现比较复杂的 ...

  9. 判断python对象是否可调用的三种方式及其区别

    查找资料,基本上判断python对象是否为可调用的函数,有三种方法 使用内置的callable函数 callable(func) 用于检查对象是否可调用,返回True也可能调用失败,但是返回False ...

  10. MySQL优化四 索引优化

    索引为什么能提高数据访问性能? 很多人只知道索引能够提高数据库的性能,但并不是特别了解其原理,其实我们可以用一个生活中的示例来理解. 我们让一位不太懂计算机的朋友去图书馆确认一本叫做<MySQL ...