理解应用程序和应用模块的区别
创建时间:2022年07月14日 11:06:20 最后更新:2024年06月16日 13:50:22

使用 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 扩展了很多功能,例如:模块化、配置系统、远程服务调用、分布式缓存、多语言解决方案等等。