天天看點

【abp vnext 實戰系列】簡單的内容管理系統:搭建架構

 PS:中文文檔位址

1- 生成項目的方式

1.1- 模闆生成位址 

  https://abp.io/get-started

1.2-abp cli 指令生成

   https://docs.abp.io/zh-Hans/abp/latest/Getting-Started?UI=MVC&DB=EF&Tiered=No

 2-項目結構

 PS:我是純手工制作,從空白模闆開始的

2.1-結構如下

PS:我不打算用動态API 是以結構做了删減

【abp vnext 實戰系列】簡單的内容管理系統:搭建架構

  •  GR.CMS.Domain.Shared 

           我需要審計日志和背景任務功能,是以添加如下引用

           Volo.Abp.Validation,

          Volo.Abp.AuditLogging.Domain.Shared,

          Volo.Abp.BackgroundJobs.Domain.Shared

【abp vnext 實戰系列】簡單的内容管理系統:搭建架構
【abp vnext 實戰系列】簡單的内容管理系統:搭建架構
【abp vnext 實戰系列】簡單的内容管理系統:搭建架構
1 [DependsOn(
 2           typeof(AbpAuditLoggingDomainSharedModule),
 3           typeof(AbpBackgroundJobsDomainSharedModule)
 4           )]
 5     public class CMSDomainSharedModule : AbpModule
 6     {
 7         public override void PreConfigureServices(ServiceConfigurationContext context)
 8         {
 9             CMSGlobalFeatureConfigurator.Configure();
10             CMSModuleExtensionConfigurator.Configure();
11         }
12 
13         public override void ConfigureServices(ServiceConfigurationContext context)
14         {
15             Configure<AbpVirtualFileSystemOptions>(options =>
16             {
17                 options.FileSets.AddEmbedded<CMSDomainSharedModule>();
18             });
19 
20             Configure<AbpLocalizationOptions>(options =>
21             {
22                 options.Resources
23                     .Add<CMSResource>("en")
24                     .AddBaseTypes(typeof(AbpValidationResource))
25                     .AddVirtualJson("/Localization/CMS");
26 
27                 options.DefaultResourceType = typeof(CMSResource);
28             });
29 
30             Configure<AbpExceptionLocalizationOptions>(options =>
31             {
32                 options.MapCodeNamespace("CMS", typeof(CMSResource));
33             });
34         }
35     }      

CMSDomainSharedModule

           其他類都是照着生成的DEMO 扣的

  • GR.CMS.Domain

          添加如下引用

           GR.CMS.Domain.Shared ,

           Volo.Abp.AuditLogging.Domain,

           Volo.Abp.BackgroundJobs.Domain

【abp vnext 實戰系列】簡單的内容管理系統:搭建架構

 PS:暫時我不太想要多租戶,是以注釋了相關配置

1 [DependsOn(
 2           typeof(CMSDomainSharedModule),
 3           typeof(AbpAuditLoggingDomainModule),
 4           typeof(AbpBackgroundJobsDomainModule)
 5           )]
 6     public class CMSDomainModule : AbpModule
 7     {
 8         public override void ConfigureServices(ServiceConfigurationContext context)
 9         {
10             //Configure<AbpMultiTenancyOptions>(options =>
11             //{
12             //    options.IsEnabled = MultiTenancyConsts.IsEnabled;
13             //});
14 
15 #if DEBUG
16             //context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());
17 #endif
18         }
19     }      
  • GR.CMS.Application.Contracts
【abp vnext 實戰系列】簡單的内容管理系統:搭建架構
1     [DependsOn(
2              typeof(CMSDomainSharedModule)
3              )]
4     public class CMSApplicationContractsModule : AbpModule
5     {
6     }      
  • GR.CMS.Application

        添加如下引用

          GR.CMS.Application.Contracts

【abp vnext 實戰系列】簡單的内容管理系統:搭建架構
1 [DependsOn(
2              typeof(CMSApplicationContractsModule),
3              typeof(CMSDomainModule)
4              )]
5     public class CMSApplicationModule : AbpModule
6     {
7     }      
  • GR.CMS.EntityFrameworkCore

     添加如下引用

           GR.CMS.Domain,

         Volo.Abp.EntityFrameworkCore.MySQL,

         Volo.Abp.AuditLogging.EntityFrameworkCore,

          Volo.Abp.BackgroundJobs.EntityFrameworkCore

【abp vnext 實戰系列】簡單的内容管理系統:搭建架構
【abp vnext 實戰系列】簡單的内容管理系統:搭建架構
【abp vnext 實戰系列】簡單的内容管理系統:搭建架構
1 [DependsOn(
 2           typeof(CMSDomainModule), 
 3           typeof(AbpEntityFrameworkCoreMySQLModule),
 4           typeof(AbpAuditLoggingEntityFrameworkCoreModule),
 5           typeof(AbpBackgroundJobsEntityFrameworkCoreModule)
 6           )]
 7     public class CMSEntityFrameworkCoreModule : AbpModule
 8     {
 9         public override void PreConfigureServices(ServiceConfigurationContext context)
10         {
11             CMSEfCoreEntityExtensionMappings.Configure();
12         }
13 
14         public override void ConfigureServices(ServiceConfigurationContext context)
15         {
16             context.Services.AddAbpDbContext<CMSDbContext>(options =>
17             {
18                 /* Remove "includeAllEntities: true" to create
19                  * default repositories only for aggregate roots */
20                 options.AddDefaultRepositories(includeAllEntities: true);
21             });
22 
23             Configure<AbpDbContextOptions>(options =>
24             {
25                 /* The main point to change your DBMS.
26                  * See also CMSMigrationsDbContextFactory for EF Core tooling. */
27                 options.UseMySQL();
28             });
29         }
30     }      

CMSEntityFrameworkCoreModule

  • GR.CMS.Web

   添加如下引用

           GR.CMS.Application,

           GR.CMS.EntityFrameworkCore,

          Volo.Abp.AspNetCore.Mvc,

          Volo.Abp.Autofac,

          Volo.Abp.BackgroundJobs.EntityFrameworkCore,

          Serilog.AspNetCore,

          Serilog.Sinks.Async,

          Volo.Abp.AspNetCore.Serilog

【abp vnext 實戰系列】簡單的内容管理系統:搭建架構
【abp vnext 實戰系列】簡單的内容管理系統:搭建架構
【abp vnext 實戰系列】簡單的内容管理系統:搭建架構
1 [DependsOn(
  2         typeof(CMSApplicationModule),
  3         typeof(CMSEntityFrameworkCoreModule),
  4         typeof(AbpAspNetCoreMvcModule),
  5         typeof(AbpAutofacModule))]
  6     public class CMSWebModule : AbpModule
  7     {
  8         public override void PreConfigureServices(ServiceConfigurationContext context)
  9         {
 10             context.Services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>
 11             {
 12                 options.AddAssemblyResource(
 13                     typeof(CMSResource),
 14                     typeof(CMSDomainModule).Assembly,
 15                     typeof(CMSDomainSharedModule).Assembly,
 16                     typeof(CMSApplicationModule).Assembly,
 17                     typeof(CMSApplicationContractsModule).Assembly,
 18                     typeof(CMSWebModule).Assembly
 19                 );
 20             });
 21         }
 22 
 23         public override void ConfigureServices(ServiceConfigurationContext context)
 24         {
 25             var hostingEnvironment = context.Services.GetHostingEnvironment();
 26             var configuration = context.Services.GetConfiguration();
 27 
 28             ConfigureUrls(configuration);
 29              
 30             ConfigureAutoMapper();
 31             ConfigureVirtualFileSystem(hostingEnvironment);
 32             ConfigureLocalizationServices();
 33              
 34             ConfigureAutoApiControllers();
 35              
 36         }
 37 
 38         private void ConfigureUrls(IConfiguration configuration)
 39         {
 40             Configure<AppUrlOptions>(options =>
 41             {
 42                 options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"];
 43             });
 44         }
 45 
 46         
 47 
 48         private void ConfigureAutoMapper()
 49         {
 50             Configure<AbpAutoMapperOptions>(options =>
 51             {
 52                 options.AddMaps<CMSWebModule>();
 53             });
 54         }
 55 
 56         private void ConfigureVirtualFileSystem(IWebHostEnvironment hostingEnvironment)
 57         {
 58             if (hostingEnvironment.IsDevelopment())
 59             {
 60                 Configure<AbpVirtualFileSystemOptions>(options =>
 61                 {
 62                     options.FileSets.ReplaceEmbeddedByPhysical<CMSDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}GR.CMS.Domain.Shared"));
 63                     options.FileSets.ReplaceEmbeddedByPhysical<CMSDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}GR.CMS.Domain"));
 64                     options.FileSets.ReplaceEmbeddedByPhysical<CMSApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}GR.CMS.Application.Contracts"));
 65                     options.FileSets.ReplaceEmbeddedByPhysical<CMSApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}GR.CMS.Application"));
 66                     options.FileSets.ReplaceEmbeddedByPhysical<CMSWebModule>(hostingEnvironment.ContentRootPath);
 67                 });
 68             }
 69         }
 70 
 71         private void ConfigureLocalizationServices()
 72         {
 73             Configure<AbpLocalizationOptions>(options =>
 74             {
 75                 options.Languages.Add(new LanguageInfo("en", "en", "English"));  
 76                 options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "簡體中文"));
 77                 options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
 78             });
 79         }
 80 
 81        
 82 
 83         private void ConfigureAutoApiControllers()
 84         {
 85             Configure<AbpAspNetCoreMvcOptions>(options =>
 86             {
 87                 options.ConventionalControllers.Create(typeof(CMSApplicationModule).Assembly);
 88             });
 89         }
 90 
 91         
 92 
 93         public override void OnApplicationInitialization(ApplicationInitializationContext context)
 94         {
 95             var app = context.GetApplicationBuilder();
 96             var env = context.GetEnvironment();
 97 
 98             if (env.IsDevelopment())
 99             {
100                 app.UseDeveloperExceptionPage();
101             }
102 
103             app.UseAbpRequestLocalization();
104 
105            
106             app.UseCorrelationId();
107             app.UseStaticFiles();
108             app.UseRouting();
109             app.UseAuthentication();
110            
111             app.UseUnitOfWork();
112             
113             app.UseAuthorization();
114              
115             app.UseAuditing();
116             app.UseAbpSerilogEnrichers();
117             app.UseConfiguredEndpoints();
118         }
119     }      

CMSWebModule

PS:  這樣子,基本的架子就搭建成功了,然後運作的時候因為沒有生成相關資料庫,是以會有錯誤日志輸出

PS:文檔位址

漫漫人生,唯有激流勇進,不畏艱險,奮力拼搏,方能中流擊水,抵達光明的彼岸

繼續閱讀