电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

使用Node.js實現Clean Architecture方法示例詳解

瀏覽:27日期:2022-06-01 08:16:20
目錄
  • Clean Architecture
    • 項目功能:
    • 項目結構
    • 項目特點
  • 代碼實現
    • 定義實體層
    • 定義存儲接口
    • 定義用例層
  • koa項目
    • 在koa項目中實現存儲層接口
    • 在koa項目中實現HTTP路由(表現層)
  • nest-js項目
    • 最后

      Clean Architecture

      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.tsimport { User } from "./user";export class Post {  author: User | null = null;  content: string = "";  updateAt: Date = new Date(); // timestamp;  createdAt: Date = new Date(); // timestamp;  title: string = "";  id: number = -1;}// server/core/src/domain/user.tsexport class User {  name: string = ""  email: string = ""  id: number = -1}

      定義存儲接口

      import { Post } from "../domain/post";export interface IPostRepository {  create(post: Post): Promise<boolean>;  find(id: number): Promise<Post>;  update(post: Post): Promise<boolean>;  delete(post: Post): Promise<boolean>;  findMany(options: { authorId: number }): Promise<Post[]>;}...import { User } from "../domain/user";export interface IUserRepository {  create(user: User): Promise<boolean>;  find(id: number): Promise<User>;}

      定義用例層

      import { User } from "../domain/user";import { IUserRepository } from "../repository/user";export class UCUser {  constructor(public userRepo: IUserRepository) {}  find(id: number) {    return this.userRepo.find(id);  }  create(name: string, email: string) {    if (email.includes("@test.com")) {      const user = new User();      user.email = email;      user.name = name;      return this.userRepo.create(user);    }    throw Error("Please use legal email");  }}

      koa項目

      在koa項目中實現存儲層接口

      // server/koa/src/user/user.repo.tsimport { PrismaClient } from "@prisma/client";import { IUserRepository, User } from "core";export class UserRepository implements IUserRepository {  prisma = new PrismaClient();  async create(user: User): Promise<boolean> {    const d = await this.prisma.user_orm_entity.create({      data: {email: user.email,name: user.name,      },    });    return !!d;  }  async find(id: number): Promise<User> {    const d = await this.prisma.user_orm_entity.findFirst({      where: {id: id,      },    });    if (d) {      const u = new User();      u.email = d?.email;      u.id = d?.id;      u.name = d?.name;      return u;    }    throw Error("user id " + id + "not found");  }}

      在koa項目中實現HTTP路由(表現層)

      // server/koa/src/user/user.controller.tsimport Router from "@koa/router";import { UCUser } from "core";import { UserRepository } from "./user.repo";export const userRouter = new Router({  prefix: "/user",});userRouter.get("/:id", async (ctx, next) => {  try {    const service = new UCUser(new UserRepository());    if (ctx.params.id) {      const u = await service.find(+ctx.params.id);      ctx.response.body = JSON.stringify(u);    }  } catch (e) {    ctx.throw(400, "some error on get user", e.message);  }  await next();});

      nest-js項目

      nestjs 項目的示例可以在此路徑中找到 (github.com/lulusir/cle… 就不在這里貼代碼了

      最后

      請注意,在實際項目中,我們不會將核心業務邏輯放在單獨的倉庫中(即core),這只是為了演示在不同框架下使用相同的業務邏輯

      通過將業務邏輯與框架分離,您可以輕松地在不同的框架和庫之間切換,而無需更改核心業務邏輯。如果您希望構建可擴展且可維護的應用程序,那么Clean Architecture 絕對值得考慮。

      如果想要演示如何接入其他框架,可以在評論區提出

      項目地址 (github.com/lulusir/cle… 覺得不錯的小伙伴,可以給個star,謝謝

      以上就是使用Node.js實現Clean Architecture方法示例詳解的詳細內容,更多關于Node.js Clean Architecture的資料請關注其它相關文章!

      標簽: JavaScript
      主站蜘蛛池模板: 深圳网站建设-高端企业网站开发-定制网页设计制作公司 | 缠膜机|缠绕包装机|无纺布包装机-济南达伦特机械设备有限公司 | 水冷散热器_水冷电子散热器_大功率散热器_水冷板散热器厂家-河源市恒光辉散热器有限公司 | 泡沫消防车_水罐消防车_湖北江南专用特种汽车有限公司 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 快干水泥|桥梁伸缩缝止水胶|伸缩缝装置生产厂家-广东广航交通科技有限公司 | 网架支座@球铰支座@钢结构支座@成品支座厂家@万向滑动支座_桥兴工程橡胶有限公司 | POM塑料_PBT材料「进口」聚甲醛POM杜邦原料、加纤PBT塑料报价格找利隆塑料 | 蔬菜清洗机_环速洗菜机_异物去除清洗机_蔬菜清洗机_商用洗菜机 - 环速科技有限公司 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 南京技嘉环保科技有限公司-杀菌除臭剂|污水|垃圾|厕所|橡胶厂|化工厂|铸造厂除臭剂 | 长沙发电机-湖南发电机-柴油发电机供应厂家-长沙明邦智能科技 | 超声波反应釜【百科】-以马内利仪器 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | 北京浩云律师事务所-法律顾问_企业法务_律师顾问_公司顾问 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | 工业风机_环保空调_冷风机_工厂车间厂房通风降温设备旺成服务平台 | 小程序开发公司-小程序制作-微信小程序开发-小程序定制-咏熠软件 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 代理记账_免费注册公司_营业执照代办_资质代办-【乐财汇】 | 磁力抛光研磨机_超声波清洗机厂家_去毛刺设备-中锐达数控 | app开发|app开发公司|小程序开发|物联网开发||北京网站制作|--前潮网络 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 内窥镜-工业内窥镜厂家【上海修远仪器仪表有限公司】 | 铝合金脚手架厂家-专注高空作业平台-深圳腾达安全科技 | 防水套管厂家_刚性防水套管_柔性防水套管_不锈钢防水套管-郑州中泰管道 | 同步带轮_同步带_同步轮_iHF合发齿轮厂家-深圳市合发齿轮机械有限公司 | 冷热冲击试验箱_温度冲击试验箱价格_冷热冲击箱排名_林频厂家 | 仪器仪表网 - 永久免费的b2b电子商务平台 | 水性绝缘漆_凡立水_绝缘漆树脂_环保绝缘漆-深圳维特利环保材料有限公司 | 无锡网站建设_小程序制作_网站设计公司_无锡网络公司_网站制作 | 钢绞线万能材料试验机-全自动恒应力两用机-混凝土恒应力压力试验机-北京科达京威科技发展有限公司 | 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 | 郑州大巴车出租|中巴车租赁|旅游大巴租车|包车|郑州旅游大巴车租赁有限公司 | 政府回应:200块在义乌小巷能买到爱情吗?——揭秘打工族省钱约会的生存智慧 | 酒糟烘干机-豆渣烘干机-薯渣烘干机-糟渣烘干设备厂家-焦作市真节能环保设备科技有限公司 | 派克防爆伺服电机品牌|国产防爆伺服电机|高低温伺服电机|杭州摩森机电科技有限公司 |