分享更有价值
被信任是一种快乐

Clean Architecture如何用Node实现

文章页正文上

今天小编给大家分享一下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文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何优雅的获取package.json文件”文章能帮助大家解决问题。一般源码学习先看README.md和pack…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册