NopCommerce用.net core重寫ef


  最近看了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 看了相關代碼,在進行解釋    

 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。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM