Abp源码分析之Abp最小系统

最小系统

创建API项目

创建API项目并安装以下依赖

Abp源码分析之Abp最小系统

修改Program.cs为以下内容

using BookApp;  var builder = WebApplication.CreateBuilder(args);  await builder.AddApplicationAsync<BookAbpModule>();  builder.Host.UseAutofac();  var app = builder.Build();  await app.InitializeApplicationAsync();  await app.RunAsync(); 

创建BookAbpModule.cs

using Microsoft.OpenApi.Models; using Volo.Abp; using Volo.Abp.Application; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.Autofac; using Volo.Abp.Domain; using Volo.Abp.Modularity; using Volo.Abp.Swashbuckle;  namespace BookApp {     [DependsOn(         typeof(AbpAutofacModule),         typeof(AbpAspNetCoreMvcModule),         typeof(AbpSwashbuckleModule)     )]     public class BookAbpModule : AbpModule     {         override public void ConfigureServices(ServiceConfigurationContext context)         {             ConfigureSwaggerServices(context.Services);         }           override public void OnApplicationInitialization(ApplicationInitializationContext context)         {             var app = context.GetApplicationBuilder();             var env = context.GetEnvironment();              app.UseStaticFiles();             app.UseRouting();              app.UseSwagger();             app.UseAbpSwaggerUI(options =>             {                 options.SwaggerEndpoint("/swagger/v1/swagger.json", "BookApp API");             });              app.UseEndpoints(endpoints =>             {                 endpoints.MapControllers();             });         }          private void ConfigureSwaggerServices(IServiceCollection services)         {             services.AddAbpSwaggerGen(                 options =>                 {                     options.SwaggerDoc("v1", new OpenApiInfo { Title = "BookApp API", Version = "v1" });                     options.DocInclusionPredicate((docName, description) => true);                     options.CustomSchemaIds(type => type.FullName);                 }             );         }     } }  

模块化编程

新建AbpModuleA类库并引用Volo.Abp.Core

//加AbpModuleAModule.cs using System.IO;  using System; using Volo.Abp.Modularity; using Volo.Abp;  namespace AbpModuleA {     public class AbpModuleAModule: AbpModule     {         public override void PreConfigureServices(ServiceConfigurationContext context)         {             Console.WriteLine("AbpModuleA.PreConfigureServices ");         }          override public void PostConfigureServices(ServiceConfigurationContext context)         {             Console.WriteLine("AbpModuleA.PostConfigureServices");         }          public override void ConfigureServices(ServiceConfigurationContext context)         {             Console.WriteLine("AbpModuleA.ConfigureServices");           }          public override void OnApplicationInitialization(ApplicationInitializationContext context)         {             Console.WriteLine("AbpModuleA.OnApplicationInitialization");          }          public override void OnPreApplicationInitialization(ApplicationInitializationContext context)         {             Console.WriteLine("AbpModuleA.OnPreApplicationInitialization");         }         override public void OnPostApplicationInitialization(ApplicationInitializationContext context)         {                Console.WriteLine("AbpModuleA.OnPostApplicationInitialization");         }     } }  

新建AbpModuleB类库并引用Volo.Abp.Core

//加AbpModuleBModule.cs using System.IO;  using System; using Volo.Abp.Modularity; using Volo.Abp;  namespace AbpModuleB {     public class AbpModuleBModule: AbpModule     {         public override void PreConfigureServices(ServiceConfigurationContext context)         {             Console.WriteLine("AbpModuleB.PreConfigureServices");         }          override public void PostConfigureServices(ServiceConfigurationContext context)         {             Console.WriteLine("AbpModuleB.PostConfigureServices");         }          public override void ConfigureServices(ServiceConfigurationContext context)         {             Console.WriteLine("AbpModuleB.ConfigureServices");           }          public override void OnApplicationInitialization(ApplicationInitializationContext context)         {             Console.WriteLine("AbpModuleB.OnApplicationInitialization");          }          public override void OnPreApplicationInitialization(ApplicationInitializationContext context)         {             Console.WriteLine("AbpModuleB.OnPreApplicationInitialization");         }         override public void OnPostApplicationInitialization(ApplicationInitializationContext context)         {                Console.WriteLine("AbpModuleB.OnPostApplicationInitialization");         }     } }  

修改Api项目的模块配置文件

//BookAbpModule.cs  using Microsoft.OpenApi.Models; using Volo.Abp; using Volo.Abp.Application; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.Autofac; using Volo.Abp.Domain; using Volo.Abp.Modularity; using Volo.Abp.Swashbuckle; using AbpModuleA; using AbpModuleB;  namespace BookApp {     [DependsOn(         typeof(AbpAutofacModule),         typeof(AbpAspNetCoreMvcModule),         typeof(AbpSwashbuckleModule),         typeof(AbpModuleAModule),         typeof(AbpModuleBModule)      )]     public class BookAbpModule : AbpModule     {         public override void PreConfigureServices(ServiceConfigurationContext context)         {             Console.WriteLine("BookAbpModule.PreConfigureServices ");         }          override public void PostConfigureServices(ServiceConfigurationContext context)         {             Console.WriteLine("BookAbpModule.PostConfigureServices");         }          override public void ConfigureServices(ServiceConfigurationContext context)         {             Console.WriteLine("BookAbpModule.ConfigureServices");              ConfigureSwaggerServices(context.Services);         }           override public void OnApplicationInitialization(ApplicationInitializationContext context)         {              Console.WriteLine("BookAbpModule.OnApplicationInitialization");              var app = context.GetApplicationBuilder();             var env = context.GetEnvironment();              if (env.IsDevelopment())             {                 app.UseDeveloperExceptionPage();             }              app.UseStaticFiles();             app.UseRouting();              app.UseSwagger();             app.UseAbpSwaggerUI(options =>             {                 options.SwaggerEndpoint("/swagger/v1/swagger.json", "BookApp API");             });             app.UseConfiguredEndpoints();         }          public override void OnPreApplicationInitialization(ApplicationInitializationContext context)         {             Console.WriteLine("BookAbpModule.OnPreApplicationInitialization");         }         override public void OnPostApplicationInitialization(ApplicationInitializationContext context)         {             Console.WriteLine("BookAbpModule.OnPostApplicationInitialization");         }          private void ConfigureSwaggerServices(IServiceCollection services)         {             services.AddAbpSwaggerGen(                 options =>                 {                     options.SwaggerDoc("v1", new OpenApiInfo { Title = "BookApp API", Version = "v1" });                     options.DocInclusionPredicate((docName, description) => true);                     options.CustomSchemaIds(type => type.FullName);                 }             );         }     } }   

运行结果

Abp源码分析之Abp最小系统

Abp源码分析之Abp最小系统

我们会发现,系统加载所有继承AbpModule的文件,并按序运行里面的方法实现对模块的配置

访问数据库

新建Entities文件夹并创建Book.cs

using Volo.Abp.Domain.Entities;  namespace BookApp.Entities {     public class Book : Entity<Guid>     {         public string Name { get; set; }     } } 

添加Data目录并添加BookAbpDbContext.cs

using BookApp.Entities; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using System.Reflection.Emit; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore;  namespace BookApp.Data {     [ConnectionStringName("Default")]     public class BookAbpDbContext : AbpDbContext<BookAbpDbContext>     {         public BookAbpDbContext(DbContextOptions<BookAbpDbContext> options)         : base(options)         { }          public DbSet<Book> Books { get; set; }          protected override void OnModelCreating(ModelBuilder builder)         {             base.OnModelCreating(builder);              builder.Entity<Book>(b =>             {                 b.ToTable(nameof(Books));             });         }     } }  

修改BookAbpModule.cs

 using Microsoft.OpenApi.Models; using Volo.Abp; using Volo.Abp.Application; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.Autofac; using Volo.Abp.Domain; using Volo.Abp.Modularity; using Volo.Abp.Swashbuckle; using AbpModuleA; using AbpModuleB; using Volo.Abp.EntityFrameworkCore; using BookApp.Data; using Volo.Abp.EntityFrameworkCore.Sqlite;  namespace BookApp {     [DependsOn(         typeof(AbpAutofacModule),         typeof(AbpAspNetCoreMvcModule),         typeof(AbpSwashbuckleModule),         typeof(AbpDddApplicationModule),         typeof(AbpDddDomainModule),         typeof(AbpEntityFrameworkCoreSqliteModule),         typeof(AbpModuleAModule),         typeof(AbpModuleBModule)      )]     public class BookAbpModule : AbpModule     {         public override void PreConfigureServices(ServiceConfigurationContext context)         {             Console.WriteLine("BookAbpModule.PreConfigureServices ");         }          override public void PostConfigureServices(ServiceConfigurationContext context)         {             Console.WriteLine("BookAbpModule.PostConfigureServices");         }          override public void ConfigureServices(ServiceConfigurationContext context)         {             Console.WriteLine("BookAbpModule.ConfigureServices");              ConfigureSwaggerServices(context.Services);              // 使用sqlite作为数据库             context.Services.AddAbpDbContext<BookAbpDbContext>(options =>             {                 options.AddDefaultRepositories(includeAllEntities: true);             });              Configure<AbpDbContextOptions>(options =>             {                 options.UseSqlite();             });         }           override public void OnApplicationInitialization(ApplicationInitializationContext context)         {              Console.WriteLine("BookAbpModule.OnApplicationInitialization");              var app = context.GetApplicationBuilder();             var env = context.GetEnvironment();              if (env.IsDevelopment())             {                 app.UseDeveloperExceptionPage();             }              app.UseStaticFiles();             app.UseRouting();              app.UseSwagger();             app.UseAbpSwaggerUI(options =>             {                 options.SwaggerEndpoint("/swagger/v1/swagger.json", "BookApp API");             });              app.UseConfiguredEndpoints();         }          public override void OnPreApplicationInitialization(ApplicationInitializationContext context)         {             Console.WriteLine("BookAbpModule.OnPreApplicationInitialization");         }         override public void OnPostApplicationInitialization(ApplicationInitializationContext context)         {             Console.WriteLine("BookAbpModule.OnPostApplicationInitialization");         }          private void ConfigureSwaggerServices(IServiceCollection services)         {             services.AddAbpSwaggerGen(                 options =>                 {                     options.SwaggerDoc("v1", new OpenApiInfo { Title = "BookApp API", Version = "v1" });                     options.DocInclusionPredicate((docName, description) => true);                     options.CustomSchemaIds(type => type.FullName);                 }             );         }     } }  

修改appsettings.json

{   "ConnectionStrings": {     "Default": "Data Source=BookApp.db"   },   "Logging": {     "LogLevel": {       "Default": "Information",       "Microsoft.AspNetCore": "Warning"     }   },   "AllowedHosts": "*" }  

安装Nuget包"Microsoft.EntityFrameworkCore.Tools",并在在项目根目录下打开命令行工具,依次执行以下命令进行数据迁移和数据库更新:

dotnet ef migrations add InitialCreate dotnet ef database update 

新建Application目录

新建IBookAppService.cs

namespace BookApp.Application {     using BookApp.Entities;      public interface IBookAppService     {         Task<string> CreateAsync(string name);         Task<List<Book>> GetListAsync();     } } 

新建BookAppService.cs

using BookApp.Entities; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories;  namespace BookApp.Application {     public class BookAppService : ApplicationService, IBookAppService     {         public IRepository<Book, Guid> Repository => LazyServiceProvider.LazyGetRequiredService<IRepository<Book, Guid>>();          public async Task<string> CreateAsync(string name)         {             var book = await Repository.InsertAsync(new Book()             {                 Name = name             });              return book.Name;         }          public async Task<List<Book>> GetListAsync()         {             var list = await Repository.GetListAsync();             return list;         }      } } 

在Controllers目录新建BookController.cs

using BookApp.Application; using Microsoft.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc; using BookApp.Entities;  namespace BookApp.Controllers {     [ApiController]     [Route("[controller]")]     public class BookController : AbpController     {         private readonly IBookAppService _service;          public BookController(IBookAppService service)         {             _service = service;         }          [HttpGet]         public Task<string> CreateAsync(string name)         {             return _service.CreateAsync(name);         }          [HttpGet("list")]         public Task<List<Book>> GetListAsync()         {             return _service.GetListAsync();         }     } } 

整个文件结构与包引用情况如下

Abp源码分析之Abp最小系统

运行结果如下

Abp源码分析之Abp最小系统

我们可以通过这两个接口添加与显示Book信息。

参考文章

作者:吴晓阳(手机:13736969112微信同号)

发表评论

相关文章