开发模块化的应用程序

Nebula支持多种开发模式:


本文将主要介绍第3类:模块化的-应用程序



模块化开发

对于复杂的业务范围,我们可以将其拆分为多个业务单元(模块),例如:

  • 用户模块
  • 订单模块
  • 商品模块
  • 仓库模块
  • 运营模块

我们可以:

  • 在一个源代码项目中实现所有的这些业务需求,即:单体应用程序
  • 也可以将它们拆分成多个源代码项目,每个业务模块对应一个项目,即:模块化应用程序

根据 代码执行主体 中的介绍,几乎所有业务需求最后会以3类技术方式实现:

xx

以上3类实现方式,ClownFish将它们抽象为3类代码执行主体:

  • HttpAction (由ASP.NET支持)
  • MessageHandler
  • BackgroundTask

这3类代码执行主体可以出现在任何类型的应用程序项目中,因此,我们可以按业务模块来组织源代码项目:

  • 每个业务模块对应一个源代码项目
  • 每个源代码项目中,根据业务需求来实现 Controller, MessageHandler, BackgroundTask
  • 然后在一个HOST项目中引用这些(或者全部)源代码项目(或者nuget包)



最终部署目标

一套代码,满足2种部署需求:

  • 单体应用部署
    • 只部署一个应用(包含所有业务功能)
    • 通常用于 私有化部署
  • 微服务部署
    • 一个模块对应一个微服务,所有微服务的共同支撑整个业务功能
    • 通常用于 云上部署

xx

说明:

  • 每个业务模块可采用微服务架构开发,对应一个Web项目,可独立运行
  • AllInOneWeb项目,本身不需要实现任何业务逻辑,只需要引用其它业务模块项目引可




模块化开发过程

模块化开发过程中可能会遇到的问题是:

  • 个别模块的源代码项目有特殊的初始化需求,例如用户模块需要注册 IdentityServer

这时就需要执行 ASP.NET 的 ConfigureServices 方法,解决方法可参考下面代码示例。


为了让每个模块的源代码项目能做到开箱即用:HOST项目只需要引用它们就可以了。

只需要2个步骤:

  • 在程序集中标记 [assembly: ClownFish.Base.ApplicationPartAssembly]
  • 在源代码项目中实现一个从BaseAppStarter继承的 公开 类型,例如:
public class DemoAppStarter : BaseAppStarter
{
    public override void PostConfigureServices(IServiceCollection services)
    {
        Console2.Info("DemoAppStarter.PostConfigureServices -----------");
    }

    public override void PostConfigureWeb(WebApplication app)
    {
        Console2.Info("DemoAppStarter.PostConfigureWeb -----------");
    }

    // 还有一些虚方法就不一一列举了
}