开发模块化的应用程序
Nebula支持多种开发模式:
本文将主要介绍第3类:模块化的-应用程序
模块化开发
对于复杂的业务范围,我们可以将其拆分为多个业务单元(模块),例如:
- 用户模块
- 订单模块
- 商品模块
- 仓库模块
- 运营模块
我们可以:
- 在一个源代码项目中实现所有的这些业务需求,即:单体应用程序
- 也可以将它们拆分成多个源代码项目,每个业务模块对应一个项目,即:模块化应用程序
根据 代码执行主体 中的介绍,几乎所有业务需求最后会以3类技术方式实现:
以上3类实现方式,ClownFish将它们抽象为3类代码执行主体:
- HttpAction (由ASP.NET支持)
- MessageHandler
- BackgroundTask
这3类代码执行主体可以出现在任何类型的应用程序项目中,因此,我们可以按业务模块来组织源代码项目:
- 每个业务模块对应一个源代码项目
- 每个源代码项目中,根据业务需求来实现 Controller, MessageHandler, BackgroundTask
- 然后在一个HOST项目中引用这些(或者全部)源代码项目(或者nuget包)
最终部署目标
一套代码,满足2种部署需求:
- 单体应用部署
- 只部署一个应用(包含所有业务功能)
- 通常用于 私有化部署
- 微服务部署
- 一个模块对应一个微服务,所有微服务的共同支撑整个业务功能
- 通常用于 云上部署
说明:
- 每个业务模块可采用微服务架构开发,对应一个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 -----------");
}
// 还有一些虚方法就不一一列举了
}