Abp源码分析之Abp最小系统
最小系统
创建API项目
创建API项目并安装以下依赖

修改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);
}
);
}
}
}
运行结果


我们会发现,系统加载所有继承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();
}
}
}
整个文件结构与包引用情况如下

运行结果如下

我们可以通过这两个接口添加与显示Book信息。
参考文章
作者:吴晓阳(手机:13736969112微信同号)
Abp源码分析之Abp最小系统的更多相关文章
- [Abp 源码分析]二、模块系统
0.简介 整个 Abp 框架由各个模块组成,基本上可以看做一个程序集一个模块,不排除一个程序集有多个模块的可能性.可以看看他官方的这些扩展库: 可以看到每个项目文件下面都会有一个 xxxModule ...
- ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...
- ABP源码分析四:Configuration
核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...
- ABP源码分析九:后台工作任务
文主要说明ABP中后台工作者模块(BackgroundWorker)的实现方式,和后台工作模块(BackgroundJob).ABP通过BackgroundWorkerManager来管理Backgr ...
- ABP源码分析十二:本地化
本文逐个分析ABP中涉及到locaization的接口和类,以及相互之间的关系.本地化主要涉及两个方面:一个是语言(Language)的管理,这部分相对简单.另一个是语言对应得本地化资源(Locali ...
- ABP源码分析二十二:Navigation
MenuDefinition:封装了导航栏上的主菜单的属性. MenuItemDefinition:封装了主菜单的子菜单的属性.子菜单可以引用其他子菜单构成一个菜单树 UserMenu/UserMen ...
- ABP源码分析二十三:Authorization
Permission:用于定义一个Permission,一个permission可以包含多个子Permission. PermissionDictionary:继承自Dictionary<str ...
- ABP源码分析三十:ABP.RedisCache
ABP 通过StackExchange.Redis类库来操作Redis数据库. AbpRedisCacheModule:完成ABP.RedisCache模块的初始化(完成常规的依赖注入) AbpRed ...
- ABP源码分析三十二:ABP.SignalR
Realtime Realtime是ABP底层模块提供的功能,用于管理在线用户.它是使用SignalR实现给在线用户发送通知的功能的前提 IOnlineClient/OnlineClient: 封装在 ...
- ABP源码分析三十三:ABP.Web
ABP.Web模块并不复杂,主要完成ABP系统的初始化和一些基础功能的实现. AbpWebApplication : 继承自ASP.Net的HttpApplication类,主要完成下面三件事一,在A ...
随机推荐
- 从论文到图谱,或许只差一个html
书接上回,在文章<论文图谱当如是:Awesome-Graphs用200篇图系统论文打个样>中,我向大家讲述了如何用图的方式思考图计算系统的演进历史,并在后续的系列文中结合Awesome-G ...
- AtCoder Beginner Contest 363
AtCoder Beginner Contest 363 前言 只出了三题,被 d 卡住了,事实上 e 题应该对我而言更简单,没及时换题. A - Piling Up (atcoder.jp) 思路 ...
- MessageBox弹出后无响应
这几天学习了自定义模板对话框类,就是说不用系统定义的模板对话框类来创建对话框 消息处理就不用返回0了,可直接返回DefWindowProc HINSTANCE hInstance = ::GetMod ...
- WM_LBUTTONDOWN,WM_LBUTTONUP
WM_LBUTTONDOWN //鼠标左键按下消息WM_LBUTTONUP //鼠标左键弹起消息参数和按下一样 当用户在窗口的客户区域中按住鼠标左键时,会发布WM_LBUTTONDOWN消息.如果未捕 ...
- 【Mac】之本地连接虚拟机linux环境
上一篇安装完centos虚拟机之后,如何远程连接呢? 先进入虚拟机的界面: 发现没有bash 终端输入: # -bash :telnet:command not found # 发现是虚拟机没有安装 ...
- 图解Zabbix设置邮件报警
Zabbix设置邮件告警 前提条件: Zabbix Server 和 Zabbix Agent都已安装完毕,并已启动 1.添加主机 2.配置邮件告警,这里以VSFTP服务为例 yum in ...
- MJUCTF—WP
1.猫娘 点开发现有两个文件, 一个加密压缩包, 一个word文档 点开word发现是兽音加密, 点开在线网站进行解密 # 得到一段文本, 先进行分割 小小年内则伏勤, 阵阵寒风刺骨寒. 是处寂寞无人 ...
- Java 1.8 Stream流原理与用法总结
一.接口设计 从Java1.8开始提出了Stream流的概念,侧重对于源数据计算能力的封装,并且支持序列与并行两种操作方式:依旧先看核心接口的设计: BaseStream:基础接口,声明了流管理的核心 ...
- SpringBoot 基于注解实现接口的代理Bean注入
SpringBoot 基于注解实现接口的代理Bean注入 在springboot加载时需自己手动将接口的代理bean注入到spring容器中,这样在service层注入该接口类型即可, 1.在Spri ...
- css实现中括号边框
要求:css + div 实现中括号边框 一.实现方式 .square_brackets { border: none; position: relative; padding: 0; height: ...