今天小编给大家分享一下Clean Architecture如何用Node实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 Clean Architecture 是 Robert C. Martin 提出的一种软件架构模式,目的是为了将系统分层,实现关注点分离,使系统更易于理解、维护和扩展。该体系结构将系统分为四个层级,从内到外分别是:实体层、用例层、表现层、基础设施(存储库,框架等)。在本文中,我们将介绍如何使用 Node.js 实现 Clean Architecture,并提供一些示例代码来演示该架构的关键概念。接下来我们将使用 TypeScript 项目示例(github.com/lulusir/cle… )。该项目采用了 Monorepo 结构,使用 Rush.js 进行管理。在 server 文件夹中包含了三个子项目,分别为 core、koa 和 nestjs-app,其中 core 为核心业务逻辑,koa是使用koa+prisma的为底层框架web项目,nestjs-app是使用nestjs + typeorm为底层框架的项目。目的是演示相同的业务逻辑如何桥接不同的框架。在这个项目中,实体层包含实体对象和相关的业务规则和逻辑,用例层包含系统的用例和业务逻辑,存储库层负责保存和检索数据,表示层则是暴露给外部的http接口。实现一个帖子发布,浏览功能用户创建,查询帖子的发布,编辑,查询,删除
├──server │├──core//核心业务逻辑 ││└──src ││├──domain ││├──repository ││└──useCase │├──koa ││└──src ││├──post ││└──user │└──nestjs-app │├──src │├──post ││├──dto ││└──entities │└──user │└──entities └──web
core:core为核心业务逻辑的代码Domain: 存放实体相关的代码,如业务具体的 model 等Use Cases: 存放业务逻辑相关的代码,如处理业务逻辑、数据验证、调用 Repository 等Repository: 存放和外部存储系统的相关接口koa/nestjs-app: core的实际消费者根据core的接口实现具体的Router,Repository使用 DDD 和 Clean Architecture 的思想,将业务逻辑与框架实现分离。使用 monorepo 项目结构,方便管理多个相关的项目。提供了多个示例应用程序,方便快速上手。基于 TypeScript,提高代码可读性和可维护性。在core中,我们有核心的业务逻辑代码。此级别包含域、存储库接口和用例。域包含与实体相关的代码,例如特定的业务模型。存储库包含与外部存储系统的相关接口。用例包含与业务逻辑相关的代码,例如处理业务逻辑、数据验证和调用存储库。在koa/nestjs-app层面,我们有核心层面的实际消费者。它们根据核心层提供的接口实现特定的路由器和存储库。
使用 Clean Architecture 的主要优点之一是它将业务逻辑与技术实现分开。这意味着您可以轻松地在不同的框架和库之间切换,而无需更改核心业务逻辑。在我们的示例中,我们可以在 koa 和 nestjs-app 之间切换,同时保持相同的核心业务逻辑。
//server/core/src/domain/post.ts import{User}from"./user"; exportclassPost{ author:User|null=null; content:string=""; updateAt:Date=newDate();//timestamp; createdAt:Date=newDate();//timestamp; title:string=""; id:number=-1; } //server/core/src/domain/user.ts exportclassUser{ name:string='' email:string='' id:number=-1 }
import{Post}from"../domain/post"; exportinterfaceIPostRepository{ create(post:Post):Promise; find(id:number):Promise ; update(post:Post):Promise ; delete(post:Post):Promise ; findMany(options:{authorId:number}):Promise ; } ... import{User}fro免费云主机、域名m"../domain/user"; exportinterfaceIUserRepository{ create(user:User):Promise ; find(id:number):Promise ; }
import{User}from"../domain/user"; import{IUserRepository}from"../repository/user"; exportclassUCUser{ constructor(publicuserRepo:IUserRepository){} find(id:number){ returnthis.userRepo.find(id); } create(name:string,email:string){ if(email.includes("@test.com")){ constuser=newUser(); user.email=email; user.name=name; returnthis.userRepo.create(user); } throwError("Pleaseuselegalemail"); } }
//server/koa/src/user/user.repo.ts import{PrismaClient}from"@prisma/client"; import{IUserRepository,User}from"core"; exportclassUserRepositoryimplementsIUserRepository{ prisma=newPrismaClient(); asynccreate(user:User):Promise{ constd=awaitthis.prisma.user_orm_entity.create({ data:{ email:user.email, name:user.name, }, }); return!!d; } asyncfind(id:number):Promise { constd=awaitthis.prisma.user_orm_entity.findFirst({ where:{ id:id, }, }); if(d){ constu=newUser(); u.email=d?.email; u.id=d?.id; u.name=d?.name; returnu; } throwError("userid"+id+"notfound"); } }
//server/koa/src/user/user.controller.ts importRouterfrom"@koa/router"; import{UCUser}from"core"; import{UserRepository}from"./user.repo"; exportconstuserRouter=newRouter({ prefix:"/user", }); userRouter.get("/:id",async(ctx,next)=>{ try{ constservice=newUCUser(newUserRepository()); if(ctx.params.id){ constu=awaitservice.find(+ctx.params.id); ctx.response.body=JSON.stringify(u); } }catch(e){ ctx.throw(400,"someerrorongetuser",e.message); } awaitnext(); });
以上就是“Clean Architecture如何用Node实现”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注云技术行业资讯频道。
这篇文章主要介绍“如何优雅的获取package.json文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何优雅的获取package.json文件”文章能帮助大家解决问题。一般源码学习先看README.md和pack…