搭建基础结构的ABP解决方案介绍

目录
  • 搭建项目基础结构
    • AbpBase.Domain.Shared
      • 创建过程
    • AbpBase.Domain
      • 创建过程
    • AbpBase.Application.Contracts
      • 创建过程
    • AbpBase.Database
      • 创建过程
    • AbpBase.Application
      • 创建过程
    • AbpBase.HttpApi
      • 创建过程
    • AbpBase.Web
      • 创建过程
  • 关于ABP和代码解疑
    • 模块
    • [DependsOn]
    • 配置服务和管道
    • 模块如何关联

搭建项目基础结构

打开 VS 2019,创建一个解决方案,然后删除解决方案的项目,变成空解决方案。本系列教程将使用 AbpBase 来命名解决方案和项目前缀。

在解决方案中新建一个解决方案文件夹,名字为 src,用来存放项目源码。

我们将要创建一个类似下图这样的层次结构的解决方案,只是没有 HttpApi.Client ,另外.EntityFrameCore 改成了 .Database

下面我们来创建需要的项目结构,和了解每一个项目的作用。

AbpBase.Domain.Shared

此项目是最底层的模块,且不依赖其他模块,主要用于定义各种枚举(enums)、全局常量(constants)、静态变量(static)、启动依赖配置(options)等。还可以在此为程序设置一个标准,限制各个层次的模块都必须符合此标准的要求。

例如 规定API 请求的一般参数,字符串长度不得大于 256 个字符,我们可以这样写:

public static Whole
{
	public const int MaxLength = 256;
}

[StringLength(maximumLength:Whole.MaxLength)]

总之,这个模块用于定义各种全局的、共享的内容(变量、枚举等),一般不包含服务。

创建过程

在解决方案中新建 .NET Standard 项目,名称为 AbpBase.Domain.Shared,然后通过 Nuget 添加 Volo.Abp.Core 包,版本为 3.1.2

然后新建 一个 AbpBaseDomainSharedModule.cs 文件,其内容如下:

using System;
using Volo.Abp.Modularity;

namespace AbpBase.Domain.Shared
{
    [DependsOn()]
    public class AbpBaseDomainSharedModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
        }
    }
}

在 ABP 项目中,每一个模块(项目) 都要创建一个继承 AbpModule 的 类,用于声明此模块的结构、依赖注入等。

[DependsOn] 是依赖注入标记,代表要为模块注入什么服务,因为 .Domain.Shared 不依赖任何模块,因此现在先留空,写成 [DependsOn()] 。

AbpBase.Domain

此项目用于定义各种用于传递数据的类。例如数据库实体、用于做参数传递的模型类等。

创建过程

我们在解决方案的src 文件夹,添加一个新的项目,名字为 AbpBase.Domain,然后引用 AbpBase.Domain.Shared 项目。

在项目中创建一个 AbpBaseDomainModule.cs 文件,其内容如下:

using AbpBase.Domain.Shared;
using Volo.Abp.Modularity;

namespace AbpBase.Domain
{
    [DependsOn(
        typeof(AbpBaseDomainSharedModule)
        )]
    public class AbpBaseDomainModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
        }
    }
}

AbpBase.Domain 依赖于 AbpBase.Domain.Shared 。

AbpBase.Application.Contracts

主要用于定义接口、抽象和 DTO 对象。这个模块用于定义各种服务,但是不提供实现。

创建过程

在解决方案的 src 文件夹,新建一个 AbpBase.Application.Contracts 项目,然后添加 AbpBase.Domain 项目引用。

在项目里新建一个 AbpBaseApplicationContractsModule 文件,其内容如下:

using AbpBase.Domain;
using Volo.Abp.Modularity;

namespace AbpBase.Application.Contracts
{
    [DependsOn(
       typeof(AbpBaseDomainModule)
   )]
    public class AbpBaseApplicationContractsModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
        }
    }
}

AbpBase.Database

此模块用于配置和定义 EFCore、Freesql 等 ORM,还有仓储等,主要是处理数据库相关的代码。

创建过程

在解决方案 的 src 目录新建一个 AbpBase.Database 项目,然后添加 AbpBase.Domain 项目引用。

在项目中新建一个 AbpBaseDatabaseModule 文件,其内容如下:

using AbpBase.Domain;
using Volo.Abp.Modularity;

namespace AbpBase.Database
{
    [DependsOn(
  	 typeof(AbpBaseDomainModule)
    )]
    public class AbpBaseDatabaseModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {

        }
    }
}

ABP 里面默认集成了 EFCore ,所以我们可以直接拿来使用,这里我们先不处理数据库相关的东西,但是先提前配好依赖注入。

在 Nuget 管理器中,添加下面四个包,版本都是 3.1.2 :

Volo.Abp.EntityFrameworkCore
Volo.Abp.EntityFrameworkCore.MySQL
Volo.Abp.EntityFrameworkCore.Sqlite
Volo.Abp.EntityFrameworkCore.SqlServer

然后将 AbpBaseDatabaseModule.cs 文件的内容修改成如下内容:

using AbpBase.Domain;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.MySQL;
using Volo.Abp.EntityFrameworkCore.Sqlite;
using Volo.Abp.EntityFrameworkCore.SqlServer;
using Volo.Abp.Modularity;

namespace AbpBase.Database
{
    [DependsOn(
        typeof(AbpBaseDomainModule),
        typeof(AbpEntityFrameworkCoreModule),
        typeof(AbpEntityFrameworkCoreSqliteModule),
        typeof(AbpEntityFrameworkCoreSqlServerModule),
        typeof(AbpEntityFrameworkCoreMySQLModule)
        )]
    public class AbpBaseDatabaseModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
        }
    }
}

这样,我们的项目将可以支持三种数据库的使用。

AbpBase.Application

此用于实现接口、编写各种服务。

创建过程

在解决方案的 src 文件夹,新建一个 AbpBase.Application 项目,然后添加 AbpBase.Application.Contracts 、 AbpBase.Database 项目引用。

在项目里创建一个 AbpBaseApplicationModule.cs 文件,其文件内容如下:

using AbpBase.Application.Contracts;
using AbpBase.Database;
using AbpBase.Domain;
using Volo.Abp.Modularity;

namespace AbpBase.Application
{
    [DependsOn(
        typeof(AbpBaseDomainModule),
        typeof(AbpBaseApplicationContractsModule),
        typeof(AbpBaseDatabaseModule)
    )]
    public class AbpBaseApplicationModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
        }
    }
}

AbpBase.HttpApi

此项目用于编写 API 控制器。

创建过程

创建 一个 .NET Core 控制台项目,名字为 AbpBase.HttpApi,通过 Nuget 添加 Volo.Abp.AspNetCore.Mvc 包,版本为 3.1.2。

然后添加 AbpBase.Application.Contracts 和 AbpBase.Application 两个项目引用。

在项目里面创建一个 AbpBaseHttpApiModule.cs 文件,其内容如下:

using AbpBase.Application;
using AbpBase.Application.Contracts;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Modularity;

namespace AbpBase.HttpApi
{
    [DependsOn(
        typeof(AbpAspNetCoreMvcModule),
        typeof(AbpBaseApplicationModule),
        typeof(AbpBaseApplicationContractsModule)
        )]
    public class AbpBaseHttpApiModule : AbpModule
    {

        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            Configure<AbpAspNetCoreMvcOptions>(options =>
            {
                options
                    .ConventionalControllers
                    .Create(typeof(AbpBaseHttpApiModule).Assembly, opts =>
                    {
                        opts.RootPath = "api/1.0";
                    });
            });
        }
    }
}

上面,模块的 ConfigureServices 函数里面,创建了 API 服务。

AbpBase.Web

此模块是最上层的模块,用于提供 UI 与用户交互、权限控制、提供启动配置信息、控制程序运行等。

创建过程

在解决方案的 src 文件夹,新建一个 AbpBase.Web 项目,项目为 ASP.NET Core 程序,并且创建模板为“空”。

通过 Nuget 管理器添加 Volo.Abp.Autofac,版本为 3.1.2,然后添加 AbpBase.Application 和 AbpBase.HttpApi 项目引用。

在项目里面创建 AbpBaseWebModule.cs 文件,其内容如下:

using AbpBase.Application;
using AbpBase.HttpApi;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Modularity;

namespace AbpBase.Web
{
    [DependsOn(
        typeof(AbpBaseApplicationModule),
        typeof(AbpAspNetCoreMvcModule),
        typeof(AbpBaseHttpApiModule)
        )]
    public class AbpBaseWebModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {

        }

        public override void OnApplicationInitialization(
            ApplicationInitializationContext context)
        {
            var app = context.GetApplicationBuilder();
            var env = context.GetEnvironment();

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
            }

            app.UseStaticFiles();
            app.UseRouting();
            app.UseConfiguredEndpoints();
        }
    }
}

在 Program.cs文件中 ,加上 .UseAutofac()

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                }).UseAutofac();

将 Startup.cs 的内容 改为:

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

namespace AbpBase.Web
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddApplication<AbpBaseWebModule>();
        }

        public void Configure(IApplicationBuilder app)
        {
            app.InitializeApplication();
        }
    }
}

完成上面的步骤后,你将得到一个可以启动的、具有基础结构的 ABP(WEB) 应用,你可以添加一个 API 来进行测试访问。

在 AbpBase.HttpApi 项目中,创建一个 COntrollers 目录,再添加一个 API 控制器,其内容如下:

using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.AspNetCore.Mvc;

namespace AbpBase.Web.Controllers
{
    [ApiController]
    public class TestController : AbpController
    {
        [HttpGet("/T")]
        public string MyWebApi()
        {
            return "应用启动成功!";
        }
    }
}

然后启动程序,访问 https://localhost:5001/T,可以发现页面显示了字符串,则测试成功。

当然,这只是一个非常简单的结构,我们还需要添加项目跨域、授权验证、依赖注入、swagger 、数据库访问等一系列的服务,后面我们将通过从易到难、逐步求精的方法来学习 ABP 框架和架设一个完整的实践项目!

下面介绍一下上面模块中出现的一些代码结构。

关于ABP和代码解疑

完成上面的步骤后,相信你应该对 ABP 项目有了大致的认识,下面我们来介绍一下 ABP 中的一些概念以及前面出现到的一些代码解析。

模块

我们看一下 ABP 官网中关于 ABP 的介绍:

ABP 框架提供的设计旨在支持构建完全模块化的应用程序和系统

前面我们建立了 7 个项目,相信大家已经体验到了模块化开发的过程。

ABP 模块化,就是将每个项目作为一个模块,然后每个模块中需要定义一个继承 AbpModule 的类,最终集成到上层模块中。

[DependsOn]

一个模块要使用另一个模块时,通过 [DependsOn] 特性来引用需要的模块。

配置服务和管道

继承 AbpModule 的类型,可以使用 ConfigureServices 来配置服务,如依赖注入、数据库配置、跨域等,OnApplicationInitialization 则用来配置中间件管道。

当然,这两个函数都可以不写,直接写个空的 Module

    [DependsOn(
        typeof(AbpBaseDomainSharedModule)
        )]
    public class AbpBaseDomainModule : AbpModule
    {
    }

模块如何关联

首先,每个模块都需要定义一个类来继承 AbpModule ,然后一个模块要使用另一个模块,则通过 [DependsOn] 来声明引用。

在本教程的解决方案结构中, AbpBase.Web 是最上层的项目,他依赖了三个模块:

    [DependsOn(
        typeof(AbpBaseApplicationModule),
        typeof(AbpBaseHttpApiModule),
        typeof(AbpAspNetCoreMvcModule)
        )]

而 AbpBaseApplicationModule 模块又使用了其他模块,这就形成了一个引用链,读者可以看看文章开头的图片。

引用链形成后,程序启动时,会顺着这个链,从最底层的模块开始初始化。这个初始化链会依次调用模块的 ConfigureServices 函数,为程序逐渐配置服务。

Domain.Shared -> Domain -> Application.Contras -> ....

你可以在每个 Module 的 ConfigureServices 函数中打印控制台信息,然后启动程序进行测试,看看打印顺序。

源码地址:https://github.com/whuanle/AbpBaseStruct

本教程结果代码位置:https://github.com/whuanle/AbpBaseStruct/tree/master/src/1/AbpBase

到此这篇关于搭建基础结构的ABP解决方案的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 为ABP框架配置数据库

    目录 创建标准的EFCore数据库上下文 连接字符串 定义隔离的上下文 多数据库支持和配置 Freesql配置服务 在 AbpBase.Database 中,通过 Nuget 添加以下几个库: 版本都是 1.9.0-preview0917,你可以使用最新版本的. Freesql FreeSql.Provider.Sqlite FreeSql.Provider.SqlServer FreeSql.Provider.MySql 创建标准的 EFCore 数据库上下文 在 ABP 中,EFCore 上

  • 为ABP框架添加基础集成服务

    目录 定义一个特性标记 全局统一消息格式 Http状态码 常用的请求结果 响应模型 全局异常拦截器 先说明一下 ApiResponseModel是抽象类 跨域请求 配置API服务 统一API模型验证消息 创建前 创建方式 创建后 补充:为什么需要统一格式 定义一个特性标记 这个标记用于标记一个枚举代表的信息. 在 AbpBase.Domain.Shared 项目,创建 Attributes目录,然后创建一个 SchemeNameAttribute 类,其内容如下: /// <summary>

  • 为ABP框架增加日志组件与依赖注入服务

    目录 自动依赖注入 添加日志依赖 添加日志功能 依赖注入 自动依赖注入 在 AbpBase.Web 的 AbpBaseWebModule 中,添加一个函数: 此函数用于扫描模块中的服务,自动将其加入容器中,这样就不需要收到加入了. /// <summary> /// 自动扫描所有的服务并进行依赖注入 /// </summary> /// <param name="context"></param> private void Configu

  • ABP框架中的事件总线功能介绍

    目录 事件总线 关于事件总线 为什么需要这个东西 事件总线创建过程 订阅事件 事件 发布事件 全局异常加入事件总线功能 创建事件 订阅事件 发布事件 测试 记录事件 事件总线 关于事件总线 ABP 中,为了方便进程间通讯,给开发者提供了一个叫 事件总线 的功能,事件总线分为 本地事件总线.分布式事件总线,本篇文章讲的是 本地事件总线,系列教程中暂时不考虑讲解 分布式事件总线. 事件总线 需要使用 Volo.Abp.EventBus 库,ABP 包中自带,不需要额外引入. 事件总线是通过 订阅-发

  • 搭建基础结构的ABP解决方案介绍

    目录 搭建项目基础结构 AbpBase.Domain.Shared 创建过程 AbpBase.Domain 创建过程 AbpBase.Application.Contracts 创建过程 AbpBase.Database 创建过程 AbpBase.Application 创建过程 AbpBase.HttpApi 创建过程 AbpBase.Web 创建过程 关于ABP和代码解疑 模块 [DependsOn] 配置服务和管道 模块如何关联 搭建项目基础结构 打开 VS 2019,创建一个解决方案,然

  • 详解VScode编辑器vue环境搭建所遇问题解决方案

    前言 为什么选择VScode? 在之前我用过sublime.webstorm.atom.Brackets.eclipse.HBuilder.notepad++等等.应该还有一些用过几次的编辑器,记不起来的,这些编辑器的作用不外乎一点--为了开发迅速.基本都会自带代码提示插件.随着项目越来越大,出了一系列问题,而这些问题会大量浪费我们的时间(我们只想简单的编程),故而编辑器插件的数量和支持程度成为了我们选择编辑器的重要条件,这就是为什么选择VScode,它拥有大量的插件,可以帮助我们完成我们没必要

  • CentOS Linux系统搭建Android开发环境详细介绍

    CentOS Linux系统搭建Android开发环境详细介绍 很多人都是在Windows下进行Android开发,但是对于Linux,Android开发环境方面的资料比较少,今天在网上找到了一位网友分享的在CentOS Linux系统中搭建Android开发环境的过程.下面就是其介绍的配置的详细步骤原文: 由于我最近每天使用的是CentOS 5.5,所以选择CentOS5.5作为我的开发环境. 主要包括以下步骤: 1.JDK安装 2.Eclipse安装 3.ADT安装 4.Android SD

  • 关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍

    介绍:Anemometer 是一个图形化显示MySQL慢日志的工具.结合pt-query-digest,Anemometer可以很轻松的帮你去分析慢查询日志,让你很容易就能找到哪些SQL需要优化 This is the Box Anemometer, the MySQL Slow Query Monitor. This tool is used to analyze slow query logs collected from MySQL instances to identify proble

  • 搭建Redis服务器步骤详细介绍

    目录 安装Redis  配置redis.config 测试登录 可视化redis软件 redis命令行中文乱码 安装Redis 我的安装包在 tar -zxvf redis-6.2.6.tar.gz 如果-zxvf不行就-xvf 解压后 cd redis-6.2.6 页面如下   再执行 make && make install 结束后,再把redis-6.2.6目录里面的redis.config拷贝到/use/local/bin/redis.config cp /opt/redis-6.

  • SpringMVC Restful风格与中文乱码问题解决方案介绍

    目录 基本要点 1.定义 2.传统方式与Restful风格的区别 3.如何使用Restful风格 4.为什么要用restful 5.乱码问题 基本要点 1.定义 根据百度百科的定义,RESTFUL是一种网络应用程序的设计风格和开发方式 2.传统方式与Restful风格的区别 在我们学习restful风格之前,我们请求接口,都是使用http://localhost:8080/controller?method=add这种方式携带接口所需要的参数 而调用restful风格的接口时,我们可以改成htt

  • 手把手教你从零开始react+antd搭建项目

    之前的文章都是自己的学习日志,主要是防止自己遗忘之前遇到的坑.这次将从最基础的项目搭建开始讲起,做一个基于react和antd的后台管理系统.我会一步步进行下去,所以看完本文你哪怕不了解react,应该也会使用react做一个简单的项目.话不多少,直接开始.完整项目请前往GitHub查看,体验请点击这里.如果觉得可以请给一颗star,谢谢各位. 1.开发环境: node.js -v 12.16.3 create-react-app -v 3.4.1 antd -v 4.3.3 项目开始前请自行全

  • jQuery跨域问题解决方案

    通过XMLHTTPRquest请求不同域上的数据,原来js跨域访问是后台有个处理路径"/test"的函数.下面把具体解决方案介绍如下. 后台处理路径"/test"的函数: 复制代码 代码如下: //路径处理 app.get("/test",user.test); //处理函数 exports.test=function(req,res){     res.end("alert('JS跨域访问')"); }; 外部有一个网页需要

  • 详解js跨域原理以及2种解决方案

    1.什么是跨域 我们经常会在页面上使用ajax请求访问其他服务器的数据,此时,客户端会出现跨域问题. 跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说,同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,这里的同一来源指的是主机名.协议和端口号的组合. 例如: 2.实现原理 在HTML DOM中,Script标签是可以跨域访问服务器上的数据的.因此,可以指定script的src属性为跨域的url,从而实现跨域访问. 例如: 这种访问方式是不行的.但是如下方式,

  • CentOS下搭建Sendmail邮件服务器步骤详解

    搭建之前,先来介绍下环境 系统环境:CentOS 5.6 32bit 域名:qiu.com 1. 添加MX记录 搭建之前,我们需要在DNS 中添加MX 记录(本例DNS 服务器地址为192.168.0.1) 测试下是否生效 2.在线安装程序 yum -y install sendmail-* #主程序 yum -y install m4-* #配置工具 yum -y install cyrus-sasl #SMTP认证 yum -y install dovecot # POP IMAP 接收 3

随机推荐