ABP是一套基于WEB的快速开发引用框架,和DDD领域驱动开发有很好的结合。
主要特性:模块化,多租户,认证授权,虚拟文件系统,主题系统,后台作业,事件总线,对象映射,依赖注入,数据过滤等。
接下来用代码的方式介绍ABP框架的使用。
Nuget中安装volo.abp.core
2.创建模块
所谓的ABP模块在代码中体现就是类,我们创建一个HelloABPModule
的类,然后引入using Volo.Abp.Modularity;
using Volo.Abp.Modularity;
namespace HelloABP
{
public class HelloABPModule:AbpModule
{
}
}
这样就创建好了一个最简单的ABP模块。模块一般不写业务逻辑。
3.我们创建一个服务
创建一个HelloWorldService
用于书写业务逻辑。
using Volo.Abp.DependencyInjection;
namespace HelloABP
{
public class HelloWorldService:ITransientDependency
{
public void Run()
{
Console.WriteLine("Hello world!");
}
}
}
ABP可以按照约定去实现自己的依赖注入,也可以通过接口的形式去实现注入。我们引入using Volo.Abp.DependencyInjection;
然后继承ITransientDependency
这样我们就用注入了周期为瞬时的HelloWorldService
进入了我们IOC容器。
手动注入服务
上面是自动注入服务的方式,接着看下手动注入的方式,手动注入服务的方式和我们直接在Statup
中注入是一样的。
using Volo.Abp.Modularity;
//添加注入服务
using Microsoft.Extensions.DependencyInjection;
namespace HelloABP
{
public class HelloABPModule:AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddTransient<HelloWorldService>();
}
}
}
我们在HelloABPModule
启动模块类进行注入就行,注入方式和原生注入一样。
4.使用
在MAIN方法中创建启动模块。
using System;
using Volo.Abp;
using Microsoft.Extensions.DependencyInjection;
namespace HelloABP
{
class Program
{
static void Main(string[] args)
{
//创建启动模块,一般一个项目只有一个启动模块,
var application = AbpApplicationFactory.Create<HelloABPModule>();
//初始化
application.Initialize();
//调用服务
var service = application.ServiceProvider.GetService<HelloWorldService>();
service.Run();
}
}
}
这样一个最简单的ABP应用就跑起来了。
1.安装依赖包
abp.aspnetcore.mvc
该包已经包含了第一部分的基础包,如果做WEB开发,安装这一个包就够了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/97546ce9f411454187db272c9e204f8a.jpeg
2.创建应用启动模块
配置启动中间件管道,因为用了ABP进行项目启动,就不需要再用Statup
类进行中间件配置了。
我们创建一个ABP模块类APPModule
代码如下:
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Modularity;
namespace WebApplication1
{
//DependsOn注解可以定义在类和方法上,意思是我这个组件要依赖于另一个组件,也就是说被依赖的组件会比该组件先注册到IOC容器中。
[DependsOn(typeof(AbpAspNetCoreMvcModule))]
public class APPModule:AbpModule
{
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
// 直接从根容器获取
//等同于Statup类Configure方法中的参数一
var app = context.GetApplicationBuilder();
//等同于Statup类Configure方法中的参数二
var env = context.GetEnvironment();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
}
上面大部分代码都是Statup
类中配置中间件的代码,我们把Statup
中Configure
方法中的中间件全部写到了ABP启动模块中,原来的Configure
只需要写启动模块的初始化代码就行了。
3.注入ABP启动模块和初始化
打开Statup
类,代码如下:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace WebApplication1
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
//注入ABP模块
services.AddApplication<APPModule>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//初始化模块
app.InitializeApplication();
}
}
}
这2句注释的代码,和标题一中的控制台程序Mian方法的代码是一个意思,先注入服务,再初始化。这样我们就配置好了web应用的APB配置。接下来的业务操作,和控制台都是一样的了。
4.在ABP中使用控制器
创建一个控制器,代码如下:
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Mvc;
namespace WebApplication1.Controllers
{
//需要继承ABP的控制器
public class HellloController:AbpController
{
public IActionResult Index()
{
return Content("Hello world");
}
}
}
并且需要把APPModule
终结点的配置换成默认的,代码如下:
//app.UseEndpoints(endpoints =>
//{
// endpoints.MapRazorPages();
//});
//配置为默认
app.UseConfiguredEndpoints();
ABP模块生命周期就三步:配置,初始化,销毁。
配置分为配置前,和配置后。
我们点进去AbpModule
可以看到Pre
和Post
这类方法,只要带Pre的就是操作之前的,Post为该方法操作之后的。
服务配置前
public virtual void PreConfigureServices(ServiceConfigurationContext context);
配置之后
public virtual void PostConfigureServices(ServiceConfigurationContext context);
初始化
public virtual void OnApplicationInitialization(ApplicationInitializationContext context);
程序结束做的事情
public virtual void OnApplicationShutdown(ApplicationShutdownContext context);
上面都是虚方法,自己有需要的业务可以重写。
预配置作用,就是在你做配置之前使用的。
首先创建一个MyModulePreOptions
类,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloABP
{
public class MyModulePreOptions
{
public bool IsEnable { get; set; }
public string Name { get; set; }
}
}
然后我们在ABP模块中进行选项预配置,直接上代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Modularity;
//添加注入服务
using Microsoft.Extensions.DependencyInjection;
namespace HelloABP
{
public class HelloABPModule:AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
PreConfigure<MyModulePreOptions>(options=>options.IsEnable=true);
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
//获取预配置后的信息
var preOptions = context.Services.ExecutePreConfiguredActions<MyModulePreOptions>();
if (preOptions.IsEnable)
{
Configure<MyModulePreOptions>(options =>options.Name="Hello Abp");
}
// context.Services.AddTransient();
}
}
}
接着调用一下。
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace HelloABP
{
public class HelloWorldService:ITransientDependency
{
private readonly IOptions<MyModulePreOptions> _options;
public HelloWorldService(IOptions<MyModulePreOptions> options)
{
_options = options;
}
public void Run()
{
Console.WriteLine(_options.Value.Name??"选项未配置");
}
}
}
结果:
我们可以在预配置环节,对你需要配置的类进行属性初始化,然后我们在启动配置那块,调用你预配置好的类,然后做一些业务处理。