- A+
一、什么是ABP.Vnext?
ABP.Vnext是一个基于Asp.Net Core Web应用程序框架。主要目的是用来快速开发Web应用,
ABP.Vnext不仅提供完整Web应用程序开发模板,而且提供Web应用程序开发所需要的一些基础设施功能。
二、什么是Module?
当然每个人看问题的角度不一样,如何能让自己快速理解就先用什么方式吧,从万物皆对象的角度,也可以说万物皆模块,只是需要自己去平衡它的边界。
我自己认为模块就是对所有组件和业务模块的抽象,取的一个名字,例如在OA系统中可以按照业务划分考勤模块,请假模块,员工模块等,也可以按照自己理解的方式去拆分处模块,最终各个不同的模块拼凑在一起协作,形成一个完整的应用程序,方便维护和及快速开发。
三、在ABP中如何使用Module
环境vs2019和.NET5
1.控制台应用程序
1.创建一个控制台应用程序
2.然后Nuget安装Abp.Vnext
Nuget Volo.Abp.Core
3.然后在控制台项目中创建模块来使用ABP,每一个自定义模块必须继承AbpModule
public class ConsoleModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { // 1、IOC注册自定义类 System.Console.WriteLine("加载AbpModuleModule模块"); //此处可以用于当前模块注册一些服务 //context.Services.AddSingleton<CustomService>(); //ConsoleHostedService主机服务,需要继承自IHostedService context.Services.AddHostedService<ConsoleHostedService>(); } }
4.修改Progarm启动类
static void Main(string[] args) { CreateHostBuilder(args).RunConsoleAsync().Wait(); } internal static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration() .ConfigureServices((hostContext, services) => { //应用程序装载自定义模块作为启动模块 services.AddApplication<ConsoleModule>(); });
2.Web应用程序
1.创建一个Web应用程序
2.然后Nuget安装Abp.Vnext
Nuget Volo.Abp.Core
3.然后在WEB项目中创建一个WebModule模块来使用ABP,模块必须继承AbpModule
public class WebModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context){} public override void OnApplicationInitialization(ApplicationInitializationContext context){} }
4.在原有Startup类中修改代码
public class Startup { public void ConfigureServices(IServiceCollection services) { //在服务中心注册WebModule为启动项 services.AddApplication<WebModule>(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { //框架初始化应用程序 app.InitializeApplication(); } }
5.将原有Web中Startup类中的注册服务和配置中间件的内容移到WebModule中
public class WebModule : AbpModule { //注册服务 public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddControllers(); } //应用程序开始时注册中间件 public override void OnApplicationInitialization(ApplicationInitializationContext context) { var app = context.GetApplicationBuilder(); var env = context.GetEnvironment(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseStaticFiles(); app.UseRouting(); app.UseConfiguredEndpoints(); } }
四、模块依赖注册
1.自定义模块
除了项目启动模块的使用如控制台,web项目等,如果要自定义模块其实也和上述2种使用方式相同,并且更为简单,不需要其他的加载项配置,只需要引入Abp.Vnext继承自AbpModule即可。
创建一个自定义的公共模块
public class CommonModule : AbpModule { //模块加载时配置一些操作或初始化服务 public override void ConfigureServices(ServiceConfigurationContext context) { System.Console.WriteLine("加载自定义CommonModule模块"); } }
2.模块依赖
假设我在我的控制台项目想要依赖我的公共模块,我应该怎么做呢,传统没有使用ABP的做法是直接引入对应类就可以完成依赖并且使用,但是使用了ABP框架之后,需要在传统的做法上做一些事情,就是在模块类上加入 [DependsOn()]特性即可。
例如我的A模块需要依赖我的B模块
[DependsOn(typeof(B))] public class A : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { System.Console.WriteLine("自定义A模块"); } } public class B : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { System.Console.WriteLine("自定义B模块"); } }
3.服务注册
首先我们要知道服务和模块是被包含的关系,“模块”包含“服务”
在使用了ABP框架后在模块中注册服务有3
种方式
1.在模块类中的ConfigureServices方法中手动注册服务
,但是如果服务增多,ConfigureServices方法中将会产生大量的注册代码,需要维护
public class CommonModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddTransient<CommonService>(); } }
2.继承自约束接口例如ITransientDependency,ISingletonDependency
,接口约束
public class CommonService:ITransientDependency { public void Common() { System.Console.WriteLine("CommonService 执行"); } }
3.在需要被注册的服务商使用特性标记[Dependency(ServiceLifetime.Transient)]
,推荐使用职责分明
//注册服务生命周期为瞬时 [Dependency(ServiceLifetime.Transient)] public class CommonService { public void Common() { System.Console.WriteLine("CommonService 执行"); } }
五、插件加载
有时候我们想实现某个标准功能的接口做一个插件模块,按需要手动配置到项目中,需要的时候就给他配置,不需要就去掉配置,而不是像模块依赖一样需要强引用,那这种做法就可以使用abp的插件加载机制
其实原理并不难,知道怎么用后,完全可以自己写一个,我们先给出在ABP中的实现步骤
1.使用vs创建插件项目Common.PlugIn模块
2.然后创建插件目录PlugIns
3.然后将Common.PlugIn.dll复制到PlugIns目录中
4.然后在Console项目中Program加载PlugIns
5.在web项目中就是在Startup注册服务中加入以下代码
services.AddApplication<ConsoleModule>( options => { options.PlugInSources.AddFolder(@"Plugin"); }); });