検索
ホームページウェブフロントエンドjsチュートリアルクリーンアーキテクチャとは何ですか? Nodeで実装するにはどうすればいいでしょうか?

クリーン アーキテクチャとは何ですか?この記事では、クリーン アーキテクチャについて説明し、Node.js を使用してクリーン アーキテクチャを実装する方法について説明します。

クリーンアーキテクチャとは何ですか? Nodeで実装するにはどうすればいいでしょうか?

クリーン アーキテクチャ

クリーン アーキテクチャは、Robert C. Martin によって提案された、システムを層に分割して目的を達成するソフトウェア アーキテクチャ パターンです。関心事の分離により、システムの理解、維持、拡張が容易になります。このアーキテクチャでは、システムが内部から外部に向かって、エンティティ層、ユースケース層、プレゼンテーション層、インフラストラクチャ (リポジトリ、フレームワークなど) の 4 つのレベルに分割されます。

クリーンアーキテクチャとは何ですか? Nodeで実装するにはどうすればいいでしょうか?

この記事では、Node.js を使用してクリーン アーキテクチャを実装する方法を紹介し、アーキテクチャの主要な概念を示すサンプル コードをいくつか提供します。

次に、TypeScript プロジェクトの例 (github.com/lulusir/cle…) を使用します。プロジェクトは Monorepo 構造を使用し、Rush.js を使用して管理されます。サーバー フォルダーには、core、koa、nestjs-app という 3 つのサブプロジェクトが含まれています。Core はコア ビジネス ロジックであり、koa は基礎となるフレームワーク Web プロジェクトとして koa prisma を使用し、nestjs-app は基礎となるフレームワークとして nestjs typeorm を使用します。 。目的は、同じビジネス ロジックが異なるフレームワークをどのように橋渡しできるかを示すことです。 [関連チュートリアルの推奨事項: nodejs ビデオ チュートリアル プログラミング教育 ]

このプロジェクトでは、エンティティ レイヤーにはエンティティ オブジェクトと関連するビジネス ルールとロジックが含まれており、ケース層にはシステムのユースケースとビジネスロジックが含まれます。リポジトリ層はデータの保存と取得を担当し、プレゼンテーション層は外部に公開される http インターフェイスです。

プロジェクト機能:

投稿公開・閲覧機能の実現

  • ユーザー作成・クエリ

  • #投稿の公開、編集、クエリ、削除

#プロジェクト構造

#
├── server
│   ├── core // 核心业务逻辑
│   │   └── src
│   │       ├── domain
│   │       ├── repository
│   │       └── useCase
│   ├── koa
│   │   └── src
│   │       ├── post
│   │       └── user
│   └── nestjs-app
│       ├── src
│           ├── post
│           │   ├── dto
│           │   └── entities
│           └── user
│               └── entities
└── web
#コア: コアはコア ビジネス ロジックのコードです。

  • ドメイン: ビジネス固有のモデルなどのエンティティ関連コードを格納します。

    ユース ケース: 格納します。ビジネス ロジック関連コード ビジネス ロジックの処理、データ検証、リポジトリの呼び出しなどのコード。
    • リポジトリ: 外部ストレージ システムのストレージおよび関連インターフェイス
    • #koa/nestjs-app: core の実際のコンシューマー
  • core のインターフェイスに基づいて特定のルーターとリポジトリを実装します

    プロジェクトの特徴

DDD とクリーン アーキテクチャのアイデアを使用して、ビジネス ロジックをフレームワークの実装から分離します。

モノリポジトリ プロジェクト構造を使用して、複数の関連プロジェクトの管理を容易にします。
  • 簡単にすぐに始められるように、複数のサンプル アプリケーションが提供されています。
  • TypeScript に基づいており、コードの可読性と保守性が向上しています。
  • コアには、コア ビジネス ロジック コードがあります。このレベルには、ドメイン、リポジトリ インターフェイス、およびユースケースが含まれます。ドメインには、特定のビジネス モデルなどのエンティティに関連するコードが含まれています。リポジトリには、外部ストレージ システムへの関連インターフェイスが含まれています。ユースケースには、ビジネス ロジックの処理、データ検証、リポジトリの呼び出しなど、ビジネス ロジックに関連するコードが含まれています。
  • koa/nestjs-app レベルでは、コア レベルに実際のコンシューマーがいます。これらは、コア層によって提供されるインターフェイスに基づいて特定のルーターとリポジトリを実装します。 クリーン アーキテクチャを使用する主な利点の 1 つは、ビジネス ロジックを技術的な実装から分離できることです。これは、コアのビジネス ロジックを変更せずに、さまざまなフレームワークやライブラリを簡単に切り替えることができることを意味します。この例では、同じコア ビジネス ロジックを維持しながら、koa とnesjs-app を切り替えることができます。

コードの実装

エンティティ レイヤーの定義

// 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
}

ストレージ インターフェイスの定義

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.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");
  }
}

koa プロジェクトでの HTTP ルーティング (プレゼンテーション層) の実装

// 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();
});

nest-js プロジェクト

nestjs プロジェクトの例ここにあります。パス内にあります (

github.com/lulusir/cle…

コードはここには投稿しません

最後に

実際のプロジェクトでは、コア ビジネス ロジックを別のウェアハウス (つまりコア) に配置しないことに注意してください。これは、別の環境でパフォーマンスを実証するためだけです。フレームワーク 同じビジネス ロジックを使用する

ビジネス ロジックをフレームワークから切り離すことにより、コア ビジネス ロジックを変更せずに、異なるフレームワークやライブラリを簡単に切り替えることができます。スケーラブルで保守可能なアプリケーションを構築したい場合は、クリーン アーキテクチャを検討する価値があります。

他のフレームワークに接続する方法をデモしたい場合は、コメント領域に

プロジェクト アドレス (github.com/lulusir/cle...#) を入力してください。 ## 良いアイデアだと思います。星を付けていただけます。ありがとうございます。

ノード関連の詳細については、

nodejs チュートリアルをご覧ください。!

以上がクリーンアーキテクチャとは何ですか? Nodeで実装するにはどうすればいいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は掘金社区で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

javascriptの分解:それが何をするのか、なぜそれが重要なのかjavascriptの分解:それが何をするのか、なぜそれが重要なのかApr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

pythonまたはjavascriptの方がいいですか?pythonまたはjavascriptの方がいいですか?Apr 06, 2025 am 12:14 AM

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい