搭建项目基础结构
打开 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解决方案的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持代码网。
发表评论