前言
很多场景【单体+模块化】比微服务更合适,开发难度低、代码可复用性强、可扩展性强。模块化开发有些难点,模块启动与卸载、模块之间的依赖和通讯。asp.net core abp为我们提供了模块化开发能力及其它基础功能。基于abp(一代6.3)结合DDD已基本开发好一个【工单管理模块】,本篇做个基本介绍并说明如何集成此模块,后续会详细说明思路。
资源线上demo::9000/ 账号:admin 密码:123qwe
后端源码:https://gitee.com/bxjg1987/abp
前端源码:https://gitee.com/bxjg1987/front
必备知识熟悉asp.net core和abp(注意是老版本,非vNext,但也很容易迁移到vNext上)
术语下文会提供到一些概念,理解这个黑重要。
abp模块:这个不解释了,是abp基础,请参考官方文档
通用模块:这个是使用abp模块开发方式做的一些通用的,与具体业务无关的模块,比如:数据字典模块
业务模块:工单管理、广告管理、电商模块等为了实现具体业务的模块。
业务场景客户是做复印机出租的,它希望做一套系统管理整个业务,其中工单是一个比较重要的模块,大致流程如下:
客户通过小程序上报工单,说明什么设备出了什么问题
系统后台管理员查看下大致问题后审核
后台管理员将已审核的工单分配给指定维修人员,或维修人员通过app自己领取已审核的工单
当维修人员到达客户处,通过app将工单设置为已执行状态
当维修人员处理完任务后通过app将工单设置为已完成状态,同时可能需要录入完成情况说明
以上是主体流程,还有些边角的以后文章会详细说明,比如:从审核状态跳跃到已完成状态;从已完成状态回退到待审核状态;状态变化时的事件等。
工单类型不同:有些工单可能并不是客户提交的,比如当采购的二手设备入库时要做检修,也会产生工单,这种情况工单不会与客户关联,而时与入库单关联;再比如让某员工开车去托快递回来这种情况工单会与物流信息关联
工单创建方式不同:客户通过小程序提交、后台管理员手动建立、当发生某些事件时自动创建(比如采购入库时自动创建)
其实工单管理模块是个通用的业务,在很多系统可能都需要,因此考虑做成独立的业务模块,方便复用。
目标 可复用工单模块以nuget包发布,你可以安装后简单配置后就可以使用。
易升级上面说了,以nuget包形式发布的,将来模块更新后发布新版本的nuget包,各系统更新下,引用新版本包就ok啦
独立性工单模块只依赖些通用的、非业务型的模块。工单模块需要用到“员工”概念,在系统中往往体现为一个用户,工单模块本身不提供“员工管理”的功能,因为你的系统可能有自己的“员工管理”功能;或你直接拿abp原始的 AbpUser作为员工也行。试想如果“工单模块”本身提供了员工管理模块,你引用过去,发现自己系统中已有实现了的员工管理,是不是很麻烦?
所以你的项目引用工单模块时需要做个适配,为工单模块提供需要用到的员工相关功能,主要是几个查询。
说明:
abp vNext使用契约层来实现模块独立化,个人认为不完整,比如你的项目中有个”员工管理“模块,你在定义契约接口和DTO时只能定义通用的,为了尽量通用,接口中的方法会尽量多,或分开多定义几个接口,DTO中的属性也会尽量多,因为你不知道将来哪各模块引用你,所以你无法定义准确的、刚好够用的接口和DTO。
现在有各”工资管理“模块,引用你的”员工管理模块“,它会拿到DTO中很多不必要的属性,也会在引入接口时拿到很多不需要的方法。
再比如我的”工单模块“如果直接引用你的契约,将来我发布工单模块,其它系统引用后,它必须去实现”员工契约“中的接口,它会很迷茫,我要实现这个契约中所有的接口吗?DTO所有的属性我都需要赋值吗?其实某些契约中的接口方法工单模块可能根本不需要,同理契约中的DTO也不一定都需要赋值。
还有更多问题,这些问题不影响使用,但挺别扭。出现这样的原因,是独立的业务模块应该在契约中定义自己能向外提供什么数据之外,还应该定义自己需要什么,而不是让别的模块的契约来指定。
我们在开发工单模块时,会从这两个方向来定义契约,即:工单模块需要什么数据?工单模块能向外提供什么数据?
可扩展abp本身提供了很强的扩展能力,你可以
通过“动态属性系统”来扩展实体类
通过工单CRUD、工单状态变化等事件来添加自己的业务逻辑
通过集成并替换工单模块提供领域服务、应用服务来重写现有业务逻辑
默认的UI只是结合我自己的项目用easyui实现的,你可以实现自己的UI
通过集成抽象工单实体、抽象工单的领域服务、抽象的工单应用服务来实现更多的工单类型
使用DDD开发方式实践下DDD