东莞网站推广优化搜索推广,wordpress 相册 链接,装修设计效果图网站,seo搜索优化专员最近看了NopCommerce源码#xff0c;用core学习着写了一个项目#xff0c;修改的地方记录下。项目地址 NopCommerce框架出来好久了。18年的第一季度 懒加载出来后也会全部移动到.net core。那么就更好玩了。 项目内容 模仿部分分层模式引擎机制DI容器EF仓储模式Mapping部分修… 最近看了NopCommerce源码用core学习着写了一个项目修改的地方记录下。项目地址 NopCommerce框架出来好久了。18年的第一季度 懒加载出来后也会全部移动到.net core。那么就更好玩了。 项目内容 模仿部分分层模式引擎机制DI容器EF仓储模式Mapping部分修改.net core 重写类库EFcore mysql 动态加载dbset 当然NopCommerce还包含很多特技PluginSeo,订阅发布theme切换等等。这些后期再维护进去。 项目介绍 项目分层 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 看了相关代码在进行解释 1 public class DataBaseStartup: ISelfStartup2 {3 4 public void ConfigureServices(IServiceCollection services, IConfigurationRoot configuration)5 {6 services.AddDbContextSelfDbContext(x x.UseMySql(configuration.GetConnectionString(MySql)));7 }8 9 public void Configure(IApplicationBuilder application)
10 {
11 var dbContextEngineContext.Current.ServiceProvider.GetServiceSelfDbContext();
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 ModelBuilderExtenions2 {3 private static IEnumerableType 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).CastISelfEntityMappingConfiguration())
12 {
13 config.Map(modelBuilder);
14 }
15 }
16 } View Code 1 public class StudentMapping : ISelfEntityMappingConfiguration2 {3 public void Map(ModelBuilder b)4 {5 b.EntityStudent().ToTable(Student)6 .HasKey(p p.Id);7 8 b.EntityStudent().Property(p p.Class).HasMaxLength(50).IsRequired();9 b.EntityStudent().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 解释 DataBaseStartup是继承Startup的数据中间件处理类。这里去选择数据库类型和dbcontext以及数据库初始化。Nopcommerce原先是在install那层判断是否存在数据库json处理数据库初始化这里简单化了初始化可以抽象出来再处理。这个类的实现是在web.framwork层。解耦了核心与web层的。这里完全可以自己再重写一个处理类用来切换数据库等其他操作。SelfDbContext是数据处理上下文类。以前写的dbcontext处理新增的实体类dbset都是一个一个属性添加这里是通过反射进行动态加载。相关的方法写在了modelbuilder的扩展方法里面ModelBuilderExtenions是modelbuilder的构建扩展方法的类。里面介绍如何通过反射查找如要map进入的实体map对象。主要通过对比类型继承的接口对象typeISelfEntityMappingConfiguration是所有map对象的上层接口通过这个类的类别判断实体加入到dbcontextStudentMapping和student类是这里举例的例子。Mapping可以对数据字段进行处理。当然也可以直接在实体类加上attribute。 3.项目继承nopcommerce的其他地方 引擎构建。项目中也构建了EngineContext和IEngine。引擎是整个项目启动的处理核心处理的东西不再复述。发现构建了这个之后 可以切换orm框架了。对于一些大型需要对接第三方同步orm那么这个构建出来之后就非常好处理了。当然好处的地方还有更多。仓储模式。这里其实是伪仓储封装多出一个仓库管理员并没有事务聚合根等做法。DI选择auotofac。 转载于:https://www.cnblogs.com/TeemoHQ/p/8343731.html