最小系统

创建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最小系统的更多相关文章

  1. [Abp 源码分析]二、模块系统

    0.简介 整个 Abp 框架由各个模块组成,基本上可以看做一个程序集一个模块,不排除一个程序集有多个模块的可能性.可以看看他官方的这些扩展库: 可以看到每个项目文件下面都会有一个 xxxModule ...

  2. ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...

  3. ABP源码分析四:Configuration

    核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...

  4. ABP源码分析九:后台工作任务

    文主要说明ABP中后台工作者模块(BackgroundWorker)的实现方式,和后台工作模块(BackgroundJob).ABP通过BackgroundWorkerManager来管理Backgr ...

  5. ABP源码分析十二:本地化

    本文逐个分析ABP中涉及到locaization的接口和类,以及相互之间的关系.本地化主要涉及两个方面:一个是语言(Language)的管理,这部分相对简单.另一个是语言对应得本地化资源(Locali ...

  6. ABP源码分析二十二:Navigation

    MenuDefinition:封装了导航栏上的主菜单的属性. MenuItemDefinition:封装了主菜单的子菜单的属性.子菜单可以引用其他子菜单构成一个菜单树 UserMenu/UserMen ...

  7. ABP源码分析二十三:Authorization

    Permission:用于定义一个Permission,一个permission可以包含多个子Permission. PermissionDictionary:继承自Dictionary<str ...

  8. ABP源码分析三十:ABP.RedisCache

    ABP 通过StackExchange.Redis类库来操作Redis数据库. AbpRedisCacheModule:完成ABP.RedisCache模块的初始化(完成常规的依赖注入) AbpRed ...

  9. ABP源码分析三十二:ABP.SignalR

    Realtime Realtime是ABP底层模块提供的功能,用于管理在线用户.它是使用SignalR实现给在线用户发送通知的功能的前提 IOnlineClient/OnlineClient: 封装在 ...

  10. ABP源码分析三十三:ABP.Web

    ABP.Web模块并不复杂,主要完成ABP系统的初始化和一些基础功能的实现. AbpWebApplication : 继承自ASP.Net的HttpApplication类,主要完成下面三件事一,在A ...

随机推荐

  1. JVM指令大全之不太全系列

    一.未归类系列A 此系列暂未归类. 指令码    助记符                            说明0x00         nop                           ...

  2. SMU Spring 2023 Trial Contest Round 10

    A. Remove Duplicates 题意大概就是从左到右数字最先数完的最先输出 所以我们可以在输入每个数时记录每个数的出现次数,然后在循环一遍,每次该数字的次数减1,当数字的次数只剩1的时候就输 ...

  3. springcloud config坑系列一之Connection pool shut down on "zuul.host.*" property change

    在使用springcloud config自动刷新功能难免会踩到一些坑,下面来介绍下 在生成中经常需要动态刷新配置,只需要增加@RefreshScope,并且执行手动刷新链接/actuator/ref ...

  4. 23. 基于Cortex-A9 uboot代码启动分析

    本篇文章是彭老师第一次在B站直播间,边直播边记录笔记,视频已经上传到B站. 现在完善整理成该篇文章,有想学习uboot启动的代码详细流程的老铁可以进入我B站空间配合视频一起学习. [视频地址] B站用 ...

  5. C#应用 - 事件总线

    目录 前言 1,简介 2,设计 2.1 设计思路 2.2 设计实现 2.2.1 IEventData 2.2.2 EventBus 2.2.3 用起来 3,问题 3.1 起缘 3.2 改造 3.3 用 ...

  6. SAR靶机笔记

    SAR 靶机笔记 概述 SAR 是 Vulnhub 上的靶机,大家可以去 vulnhub 网站上去进行下载. 这里有链接: https://download.vulnhub.com/sar/sar.z ...

  7. Windows 查看当前登录用户名

    使用 PowerShell 输入 whoami,PowerShell 将以 hostname\username 的方式输出主机名和用户名: $ whoami hostname\username 使用 ...

  8. ptmalloc2涉及的基础知识与基本数据结构

    随笔来源:ctfwiki CSDN 本随笔只为记录分析总结的自己学习的结论,方便未来回顾,以及为他人提供一个理解的思路,不保证正确.如有谬误,请大家指出. 1.堆相关的操作 malloc:返回对应大小 ...

  9. Python批量分割Excel后逐行做差、合并文件的方法

      本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件,首先依据某一列数据的特征截取我们需要的数据,随后对截取出来的数据逐行求差,并基于其他多个文件夹中同样大量 ...

  10. docker image 变小的办法

    https://www.docker.com/blog/intro-guide-to-dockerfile-best-practices/ https://medium.com/sciforce/st ...