前面我们已经逐步完善了我们的单层应用,但是随着复杂度提升,单层应用逐渐变得臃肿。为了更好地应对日益增长的业务需求和保持应用的可维护性,我们需要考虑将单层应用升级为多层应用。
升级思路
在单层应用中,我们讲基础设施的功能以及业务功能都写在同一个项目中,这将使得后期复杂度越来越高,可维护性越来越低。 首先先思考,哪些部分是属于业务无关的基础功能,哪些是通用的功能数据,哪些是业务功能。 根据这几个问题,暂时先考虑这样安排: 业务无关的基础功能抽离到Core。 通用的功能数据(如枚举,静态遍历)抽离到Shared。 把数据库相关的抽离成Domain和Data。 然后业务功能暂时还是放在Host。
整理目录结构
讲解完思路,那么接下来就是按照拆分思路整理目录结构了。 再来回顾我们单层的目录结构,如图:
开始拆分
Wheel.Core
我们先新建一个Wheel.Core类库,把Cache,DependencyInjection,Dto,EventBus,Exceptions,Expressions,Extensions,Json,Notifications,Users,Utilities迁移到进去。 这里需要注意的是,类库不包含AspNetCore的相关API,编译会报错,所以我们需要添加以下框架依赖,在项目文件中添加:
代码语言:javascript复制<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App"></FrameworkReference>
</ItemGroup>
Wheel.Shared
接下来新建一个类库Wheel.Shared把静态类和枚举类的目录Const和Enums迁移进去。
Wheel.Domain
新建一个类库Wheel.Domain,将我们的原本Domain中的所有目录迁移进去,然后把IBasicRepository,IDbTransaction,IUnitOfWork接口迁移进去。
Wheel.Data
新建一个类库Wheel.Data,依赖Wheel.Domain项目,将DbContext,EFBasicRepository实现以及工作单元的实现DbTransaction和UnitOfWork迁移进去。
整理项目依赖关系
代码拆分好了之后就开始整理项目间的依赖关系了。 Wheel.Core是0依赖,里面放的是框架的基础设施。 Wheel.Shared是0依赖,所有用到里面的静态类和枚举的项目才需要引用它。 Wheel.Domain依赖Wheel.Shared和Wheel.Core。 Wheel.Data依赖Wheel.Domain。 Host直接或间接依赖上面几个类库。 最终结构如下图:
跟我们一开始单层应用对比,Host的内容少了一部分,但还是稍显臃肿,我们的业务功能的实现还是堆积再Host中,所以我们还需要再做进一步的优化和拆分。 那么下一篇我们再来做进一步的工作。