一、什么是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");
}); });

ABP.VNext-模块的更多相关文章

  1. ABP VNext框架中Winform终端的开发和客户端授权信息的处理

    在ABP VNext框架中,即使在它提供的所有案例中,都没有涉及到Winform程序的案例介绍,不过微服务解决方案中提供了一个控制台的程序供了解其IDS4的调用和处理,由于我开发过很多Winform项 ...

  2. [Abp vNext 源码分析] - 2. 模块系统的变化

    一.简要说明 本篇文章主要分析 Abp vNext 当中的模块系统,从类型构造层面上来看,Abp vNext 当中不再只是单纯的通过 AbpModuleManager 来管理其他的模块,它现在则是 I ...

  3. 给 ABP vNext 应用安装私信模块

    在上一节五分钟完成 ABP vNext 通讯录 App 开发 中,我们用完成了通讯录 App 的基础开发. 这本章节,我们会给通讯录 App 安装私信模块,使不同用户能够通过相互发送消息,并接收新私信 ...

  4. 初识ABP vNext(12):模块的独立运行与托管

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 模块运行 动态 C# API 客户端 最后 前言 很久没更新这个系列...之前的章节中讲到ABP的模块是可以独立运行的 ...

  5. 在ABP VNext框架中对HttpApi模块的控制器进行基类封装

    在ABP VNext框架中,HttpApi项目是我们作为Restful格式的控制器对象的封装项目,但往往很多案例都是简单的继承基类控制器AbpControllerBase,而需要在每个控制器里面重写很 ...

  6. [Abp vNext 源码分析] - 文章目录

    一.简要介绍 ABP vNext 是 ABP 框架作者所发起的新项目,截止目前 (2019 年 2 月 18 日) 已经拥有 1400 多个 Star,最新版本号为 v 0.16.0 ,但还属于预览版 ...

  7. [Abp vNext 源码分析] - 3. 依赖注入与拦截器

    一.简要说明 ABP vNext 框架在使用依赖注入服务的时候,是直接使用的微软提供的 Microsoft.Extensions.DependencyInjection 包.这里与原来的 ABP 框架 ...

  8. [Abp vNext 源码分析] - 1. 框架启动流程分析

    一.简要说明 本篇文章主要剖析与讲解 Abp vNext 在 Web API 项目下的启动流程,让大家了解整个 Abp vNext 框架是如何运作的.总的来说 ,Abp vNext 比起 ABP 框架 ...

  9. 用abp vNext快速开发Quartz.NET定时任务管理界面

    今天这篇文章我将通过实例代码带着大家一步一步通过abp vNext这个asp.net core的快速开发框架来进行Quartz.net定时任务调度的管理界面的开发.大伙最好跟着一起敲一下代码,当然源码 ...

  10. Abp vNext 切换MySql数据库

    Abp vNext是Abp的下一代版本,目前还在经一步完善,代码已经全部重写了,好的东西保留了下来,去除了很多笨重的东西,从官宣来看,Abp vNext主要是为了以后微服务架构而诞生的. 从源码来看, ...

随机推荐

  1. MySQL统计总数就用count(*),别花里胡哨的《死磕MySQL系列 十》

    有一个问题是这样的统计数据总数用count(*).count(主键ID).count(字段).count(1)那个效率高. 先说结论,不用那么花里胡哨遇到统计总数全部使用count(*). 但是有很多 ...

  2. Dapr-发布/订阅

    前言 前篇文章对Dapr的状态管理进行了解,本篇继续对 订阅/发布 构建块进行了解. 一.定义: 发布订阅的概念来自于事件驱动架构(EDA)的设计思想,这是一种让程序(应用.服务)之间解耦的主要方式, ...

  3. [atARC122F]Domination

    如果一个红石头在另一个红石头的左下方(包括左和下),那么在后者的限制满足时,前者也一定满足,因此可以删去前者,再将其按照$rx_{i}$排序,即有$rx_{1}<rx_{2}<...< ...

  4. [atAGC052B]Tree Edges XOR

    定义两点的距离$d(x,y)$为$x$到$y$路径上边权异或和,则两棵树相同当且仅当$\forall 1\le i\le n$,$d(1,i)$相同 新建一个节点0,连边$(0,1)$,初始权值为0, ...

  5. 爬虫——正则表达式爬取豆瓣电影TOP前250的中英文名

    正则表达式爬取豆瓣电影TOP前250的中英文名 1.首先要实现网页的数据的爬取.新建test.py文件 test.py 1 import requests 2 3 def get_Html_text( ...

  6. SpringCloud升级之路2020.0.x版-43.为何 SpringCloudGateway 中会有链路信息丢失

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在开始编写我们自己的日志 Filter 之前,还有一个问题我想在这里和大家分享,即在 Sp ...

  7. 洛谷 P6624 - [省选联考 2020 A 卷] 作业题(矩阵树定理+简单数论)

    题面传送门 u1s1 这种题目还是相当套路的罢 首先看到 \(\gcd\) 可以套路地往数论方向想,我们记 \(f_i\) 为满足边权的 \(\gcd\) 为 \(i\) 的倍数的所有生成树的权值之和 ...

  8. [NOI Online 2021 提高组] 积木小赛

    思路不说了. 想起来自己打比赛的时候,没睡好.随便写了个\(HASH\),模数开小一半分都没有. 然后学了\(SAM\),发现这个判重不就是个水题. \(SAM\)是字串tire的集合体. 随便\(d ...

  9. Atcoder Regular Contest 072 C - Alice in linear land(思维题)

    Atcoder 题面传送门 & 洛谷题面传送门 首先求出 \(s_i\) 表示经过 \(i\) 次操作后机器人会位于什么位置,显然 \(s_0=D\),\(s_i=\min(s_{i-1},| ...

  10. P3438 [POI2006]ZAB-Frogs

    P3438 [POI2006]ZAB-Frogs 给出一个不一样的解法.不需要用到斜率优化等高级算法. 下文记 \(n=w_x,m=w_y\). 首先,答案显然满足可二分性,因此二分答案 \(d\in ...