久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

Clean Architecture是什么?怎么用Node實現(xiàn)?

Clean Architecture是什么?本篇文章帶大家了解一下Clean Architecture,并聊聊使用Node.js實現(xiàn)Clean Architecture的方法,希望對大家有所幫助!

Clean Architecture是什么?怎么用Node實現(xiàn)?

Clean Architecture

Clean Architecture 是 Robert C. Martin 提出的一種軟件架構(gòu)模式,目的是為了將系統(tǒng)分層,實現(xiàn)關(guān)注點分離,使系統(tǒng)更易于理解、維護和擴展。該體系結(jié)構(gòu)將系統(tǒng)分為四個層級,從內(nèi)到外分別是:實體層、用例層、表現(xiàn)層、基礎(chǔ)設(shè)施(存儲庫,框架等)。

Clean Architecture是什么?怎么用Node實現(xiàn)?

在本文中,我們將介紹如何使用 Node.js 實現(xiàn) Clean Architecture,并提供一些示例代碼來演示該架構(gòu)的關(guān)鍵概念。

接下來我們將使用 TypeScript 項目示例(github.com/lulusir/cle… )。該項目采用了 Monorepo 結(jié)構(gòu),使用 Rush.js 進行管理。在 server 文件夾中包含了三個子項目,分別為 core、koa 和 nestjs-app,其中 core 為核心業(yè)務(wù)邏輯,koa是使用koa+prisma的為底層框架web項目,nestjs-app是使用nestjs + typeorm為底層框架的項目。目的是演示相同的業(yè)務(wù)邏輯如何橋接不同的框架?!鞠嚓P(guān)教程推薦:nodejs視頻教程、編程教學(xué)】

在這個項目中,實體層包含實體對象和相關(guān)的業(yè)務(wù)規(guī)則和邏輯,用例層包含系統(tǒng)的用例和業(yè)務(wù)邏輯,存儲庫層負責保存和檢索數(shù)據(jù),表示層則是暴露給外部的http接口。

項目功能:

實現(xiàn)一個帖子發(fā)布,瀏覽功能

  • 用戶創(chuàng)建,查詢

  • 帖子的發(fā)布,編輯,查詢,刪除

項目結(jié)構(gòu)

├── server │   ├── core // 核心業(yè)務(wù)邏輯 │   │   └── src │   │       ├── domain │   │       ├── repository │   │       └── useCase │   ├── koa │   │   └── src │   │       ├── post │   │       └── user │   └── nestjs-app │       ├── src │           ├── post │           │   ├── dto │           │   └── entities │           └── user │               └── entities └── web
登錄后復(fù)制

  • core:core為核心業(yè)務(wù)邏輯的代碼

    • Domain: 存放實體相關(guān)的代碼,如業(yè)務(wù)具體的 model 等
    • Use Cases: 存放業(yè)務(wù)邏輯相關(guān)的代碼,如處理業(yè)務(wù)邏輯、數(shù)據(jù)驗證、調(diào)用 Repository 等
    • Repository: 存放和外部存儲系統(tǒng)的相關(guān)接口
  • koa/nestjs-app: core的實際消費者

    • 根據(jù)core的接口實現(xiàn)具體的Router,Repository

項目特點

  • 使用 DDD 和 Clean Architecture 的思想,將業(yè)務(wù)邏輯與框架實現(xiàn)分離。
  • 使用 monorepo 項目結(jié)構(gòu),方便管理多個相關(guān)的項目。
  • 提供了多個示例應(yīng)用程序,方便快速上手。
  • 基于 TypeScript,提高代碼可讀性和可維護性。

在core中,我們有核心的業(yè)務(wù)邏輯代碼。此級別包含域、存儲庫接口和用例。域包含與實體相關(guān)的代碼,例如特定的業(yè)務(wù)模型。存儲庫包含與外部存儲系統(tǒng)的相關(guān)接口。用例包含與業(yè)務(wù)邏輯相關(guān)的代碼,例如處理業(yè)務(wù)邏輯、數(shù)據(jù)驗證和調(diào)用存儲庫。

在koa/nestjs-app層面,我們有核心層面的實際消費者。它們根據(jù)核心層提供的接口實現(xiàn)特定的路由器和存儲庫。 使用 Clean Architecture 的主要優(yōu)點之一是它將業(yè)務(wù)邏輯與技術(shù)實現(xiàn)分開。這意味著您可以輕松地在不同的框架和庫之間切換,而無需更改核心業(yè)務(wù)邏輯。在我們的示例中,我們可以在 koa 和 nestjs-app 之間切換,同時保持相同的核心業(yè)務(wù)邏輯。

代碼實現(xiàn)

定義實體層

// server/core/src/domain/post.ts import { 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.ts export class User {   name: string = ''    email: string = ''    id: number = -1 }
登錄后復(fù)制

定義存儲接口

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>; }
登錄后復(fù)制

定義用例層

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");   } }
登錄后復(fù)制

koa項目

在koa項目中實現(xiàn)存儲層接口

// server/koa/src/user/user.repo.ts import { 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");   } }
登錄后復(fù)制

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

// server/koa/src/user/user.controller.ts import 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(); });
登錄后復(fù)制

nest-js項目

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

最后

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

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

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

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

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
麻豆久久久久久| 久久激五月天综合精品| 精品女同一区二区三区在线观看| 国产日韩欧美中文在线| 香蕉视频成人在线观看| 免费观看久久av| 免费国产自久久久久三四区久久 | 久久av网址| 国产高清精品二区| 欧美一区免费| 久久午夜影院| 日韩一区二区在线免费| 欧美成人久久| 欧美日韩日本国产亚洲在线 | 日本欧美在线看| 欧美专区18| 午夜视频一区二区在线观看| 91成人在线| 九九99久久精品在免费线bt| 国产aa精品| 成人羞羞视频播放网站| 日韩一区二区免费看| 久久亚洲图片| 欧美一区二区三区久久| 国产精品一二| 精品一级视频| 午夜精品久久久久久久久久蜜桃| 久久夜夜操妹子| 制服诱惑一区二区| 日韩精品成人| 国内精品伊人| 在线视频观看日韩| 天堂久久一区| 成人国产精选| 一本一道久久a久久精品蜜桃| 日韩有吗在线观看| 久久亚洲人体| 欧美成人综合| 日韩高清不卡在线| 国产成人精品999在线观看| 久久国产亚洲| 亚洲精品自拍| 国产91在线播放精品| 国产在线欧美| 欧美自拍一区| 日韩和的一区二在线| 中文无码日韩欧| 高清一区二区三区av| 亚洲在线观看| 久久精品国产久精国产| 免费观看久久av| 欧美一级网站| 久久精品av| 国产日韩一区二区三区在线| 欧美日韩尤物久久| 亚洲69av| 香蕉成人av| 97精品资源在线观看| 色婷婷久久久| 日韩av不卡在线观看| 日韩欧美精品一区| 视频一区日韩精品| 亚洲天堂1区| 日精品一区二区三区| 最新中文字幕在线播放| 最新亚洲国产| 日韩不卡免费高清视频| 日韩精品免费视频人成| 久久久久久久久丰满| 国产剧情一区| 夜夜嗨一区二区三区| 成人高清一区| 国产日韩一区二区三区在线播放| 红桃视频亚洲| 久久毛片亚洲| 国产麻豆一区| 国产欧美精品久久| 久久夜色精品| 欧美亚洲激情| 亚洲黄色免费看| 国产欧美日韩免费观看| 亚洲综合另类| 日韩美女一区二区三区在线观看| 国产欧美在线| 国产亚洲高清视频| 久久久精品久久久久久96| 欧美精品97| 中文字幕av一区二区三区人| 91九色精品| 日韩中文在线电影| 欧美国产另类| 欧美在线看片| 在线精品视频一区| 在线综合亚洲| 午夜欧美精品| 999国产精品视频| 国产色播av在线| 欧美激情一区| 久久gogo国模啪啪裸体| 久久激情综合网| 日韩福利视频导航| 日韩在线麻豆| 中文字幕亚洲精品乱码| 欧美日韩四区| 一本一道久久a久久精品蜜桃| 日韩一区二区在线免费| 精品国产欧美日韩| 精品一区二区三区四区五区| 欧美日韩亚洲一区在线观看| 丝袜美腿高跟呻吟高潮一区| 激情综合网址| 日本在线啊啊| 福利一区二区| 国产成人久久精品一区二区三区| 欧美激情一区| 精品国产黄a∨片高清在线| 国产精品99精品一区二区三区∴| 欧美日韩在线精品一区二区三区激情综合 | 欧美日本二区| 欧美片第1页综合| 日韩国产91| 涩涩涩久久久成人精品| 在线看片一区| 日韩激情网站| 欧美精品三级在线| 欧美激情三区| 激情久久99| 欧美二三四区| 久久激情婷婷| 99热精品在线观看| 久久不射网站| 亚洲精品成人一区| 欧美久久亚洲| 国内精品麻豆美女在线播放视频| 久久精品国产99国产| 精品久久久久中文字幕小说| 91日韩免费| 成人影视亚洲图片在线| 中文字幕在线视频久| 亚洲一级网站| 免费在线欧美视频| 日韩高清成人在线| 久久精品国产网站| 久久免费高清| 99国产精品久久久久久久| 日本欧美在线看| 国产一精品一av一免费爽爽| 精品国产美女a久久9999| 丝袜美腿诱惑一区二区三区| 欧美精品一卡| 免费污视频在线一区| 国产模特精品视频久久久久| 另类国产ts人妖高潮视频| 四虎精品永久免费| 麻豆久久一区二区| 婷婷激情一区| 免费成人av在线播放| 青青国产精品| 国产欧美一区二区三区精品酒店| 精品在线99| 少妇高潮一区二区三区99| 老司机免费视频一区二区三区| 日韩精品一卡| 日本成人在线不卡视频| 久久一区欧美| 午夜av一区| 日韩欧美三区| 精品五月天堂| 日韩视频在线一区二区三区| 日本欧美一区二区在线观看| 日本精品黄色| 妖精视频成人观看www| 国产精品日韩精品中文字幕| 麻豆mv在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品中文字幕制服诱惑| 99精品在线观看| 视频一区日韩精品| а√在线中文在线新版| 久久午夜精品| 粉嫩av一区二区三区四区五区| 日韩视频精品在线观看| 国产丝袜一区| 蜜桃视频欧美| 国产精品网在线观看| 欧洲毛片在线视频免费观看| 欧美中文高清| 在线精品小视频| 欧美交a欧美精品喷水| 亚洲少妇在线| 精品日韩一区| 一级成人国产| 亚洲精品88| 国产欧美自拍一区| 性欧美xxxx免费岛国不卡电影| 欧美日韩一区自拍| 国产美女精品| 精品日韩在线| 亚洲精品系列| 久久精品动漫|