当前位置: 代码网 > it编程>编程语言>Asp.net > 搭建基础结构的ABP解决方案介绍

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

2024年05月18日 Asp.net 我要评论
搭建项目基础结构打开 vs 2019,创建一个解决方案,然后删除解决方案的项目,变成空解决方案。本系列教程将使用abpbase来命名解决方案和项目前缀。在解决方案中新建一个解决方案文件夹,名字为src

搭建项目基础结构

打开 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)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com