NopCommerce用.net core重寫ef

  最近看了NopCommerce源碼,用core學習着寫了一個項目,修改的地方記錄下。項目地址mysql

  NopCommerce框架出來很久了。18年的第一季度 懶加載出來後也會所有移動到.net core。那麼就更好玩了。git


 

  項目內容github

  1. 模仿部分
    1. 分層模式
    2. 引擎機制
    3. DI容器
    4. EF
    5. 倉儲模式
    6. Mapping
  2. 部分修改
    1. .net core 重寫類庫
    2. EFcore mysql 動態加載dbset

      固然NopCommerce還包含不少特技:Plugin,Seo,訂閱發佈,theme切換等等。這些後期再維護進去。web


   項目介紹sql

  1. 項目分層

    

    1. 一、Libraries

        Nop.Core:【核心層】基礎設施,例:領域對象,倉庫接口,引擎接口,DI管理接口,反射,公共方法。數據庫

        Nop.Data:【數據層】EF相關,dbcontext,倉儲實現,mappingjson

        Nop.Services:【服務層】數據邏輯處理由這層提供。app

    1. 二、Presentation

        Nop.Web:【頁面層】展現界面。框架

        Nop.Web.Framework:【頁面基礎層】web層的上層封裝。例如啓動項的實現,DI實現。ide

                 詳細的分層思想和細節這裏再也不復述。

 

    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。
相關文章
相關標籤/搜索