使用 ABP CLI 创建新解决方案时,我们需要选择项目类型:-t app
应用程序或-t module
应用模块,类型不同,应用的启动模板也不同。那么二者究竟有什么区别呢?
最大的区别是:二者最大的区别体现在.Web
项目
- 应用程序中
.Web
项目是启动项目;模块中的.Web
项目是类库项目。 - 应用模块中
.Web
项目发布为程序集,供宿主应用程序引用;应用程序类型发布为可执行程序,作为应用程序启动入口。 - 应用程序作为“宿主”承载应用模块
接下来,我们从两个方面来细看下.Web
项目:
- 项目设置
- 模块配置
项目设置不同
静态资源处理方式不同
应用模块,将静态资源(js/css,包括 wwwroot 目录)都作为资源嵌入到程序集中,所以需要添加包引用 Microsoft.Extensions.FileProviders.Embedded
以支持虚拟文件系统。
应用程序,静态文件则直接复制到目标发布目录。
项目引用不同
应用模块只引用 HttpApi
项目;应用程序需要引用 HttpApi
Application
EntityFrameworkCore
项目,后两个项目是应用服务和仓储实现。
前端项目依赖
应用模块只需要依赖 Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared
;应用程序则需要依赖 Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic
基础主题。
在应用模块中不需要确定具体的主题,而在应用程序中需要确定使用的主题,这样就实现了应用模块随着“宿主”应用程序确定的主题而呈现不同的风格。
Sdk不同
以 .NET 5.0 版本为例
宿主WEB项目默认配置
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
</Project>
程序集项目默认配置
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
</Project>
发布程序集类型不同
项目发布,应用模块发布为程序集,而应用程序发布为启动程序集。
模块.Web
项目:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<OutputType>Library</OutputType>
</PropertyGroup>
</Project>
应用程序.Web
项目
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
</Project>
关于MsBuild更多资料参考:
模块配置不同
应用模块.Web
项目通常需要在模块定义类中设置:
- 虚拟文件配置
- 程序集资源
- IMvcBuilder(单独加载程序集的需要)
- 菜单提供程序配置(可选)
- 自动映射配置(可选)
以上配置除了 IMvcBuilder
配置,其他都是可选的,用到的功能才需要。
PreConfigure<IMvcBuilder>(mvcBuilder =>
{
mvcBuilder.AddApplicationPartIfNotExists(typeof(MyProjectNameWebModule).Assembly);
});
应用程序.Web
项目作为启动项目,通常需要设置:
- 路由
- 终结点
- 异常处理
- 身份认证等
应用程序,则需要配置WEB应用程序所需的功能,当然也是按需配置。
补充:框架模块 vs 应用模块
Abp Framework 核心基础功能之一是模块化。模块分为两种类型:框架模块、应用模块。
- 框架模块: 对特定技术功能的封装和复用,如缓存、邮件、主题、安全、序列化、验证、EF Core集成、MongoDB集成等等,与具体业务逻辑无关,提供通用基础设施。
- 应用模块: 对特定业务功能的封装和复用,如:博客管理、文档管理、身份管理、租户管理等等,具有规范的分层结构,如:展示层、应用层、领域层、基础层,各层通常会依赖框架模块快速实现具体业务。
补充:ASP.NET Core 与 ABP Framework 的关系
ABP Framework 定位是在 ASP.NET Core 框架基础上的补充、扩展和延伸,注意是扩展而不是替代,所以使用 ABP Framework 之后对于ASP.NET Core 框架的使用方式不变。
我们也看到 ABP Framework 开发者们正在实现这一目标,ABP Framework 扩展了很多功能,例如:模块化、配置系统、远程服务调用、分布式缓存、多语言解决方案等等。