Rumah  >  Artikel  >  hujung hadapan web  >  Apakah Seni Bina Bersih? Bagaimana untuk melaksanakannya dengan Node?

Apakah Seni Bina Bersih? Bagaimana untuk melaksanakannya dengan Node?

青灯夜游
青灯夜游ke hadapan
2023-02-22 19:39:462286semak imbas

Apakah Seni Bina Bersih? Artikel ini akan membawa anda melalui Seni Bina Bersih dan bercakap tentang cara melaksanakan Seni Bina Bersih menggunakan Node.js. Saya harap ia akan membantu anda.

Apakah Seni Bina Bersih? Bagaimana untuk melaksanakannya dengan Node?

Clean Architecture

Clean Architecture ialah corak seni bina perisian yang dicadangkan oleh Robert C. Martin untuk membahagikan sistem kepada lapisan untuk mencapai pengasingan kebimbangan, menjadikan sistem lebih mudah difahami, diselenggara dan dikembangkan. Seni bina ini membahagikan sistem kepada empat peringkat, dari dalam ke luar: lapisan entiti, lapisan kes penggunaan, lapisan pembentangan, infrastruktur (repositori, rangka kerja, dll.).

Apakah Seni Bina Bersih? Bagaimana untuk melaksanakannya dengan Node?

Dalam artikel ini, kami akan memperkenalkan cara melaksanakan Seni Bina Bersih menggunakan Node.js dan menyediakan beberapa kod sampel untuk menunjukkan konsep utama seni bina.

Seterusnya kita akan menggunakan contoh projek TypeScript (github.com/lulusir/cle… ). Projek ini menggunakan struktur Monorepo dan diuruskan menggunakan Rush.js. Folder pelayan mengandungi tiga sub-projek, iaitu teras, koa dan nestjs-app Core ialah logik perniagaan teras, koa menggunakan koa+prisma sebagai projek web rangka kerja, dan nestjs-app menggunakan nestjs + typeorm rangka kerja asas. Tujuannya adalah untuk menunjukkan bagaimana logik perniagaan yang sama boleh merapatkan rangka kerja yang berbeza. [Tutorial berkaitan yang disyorkan: tutorial video nodejs, Pengajaran pengaturcaraan]

Dalam projek ini, lapisan entiti mengandungi objek entiti dan peraturan dan logik perniagaan yang berkaitan, dan penggunaan lapisan kes Mengandungi kes penggunaan dan logik perniagaan sistem, lapisan repositori bertanggungjawab untuk menyimpan dan mendapatkan semula data, dan lapisan pembentangan ialah antara muka http yang terdedah kepada luar.

Fungsi projek:

Laksanakan fungsi penerbitan dan penyemakan imbas siaran

  • Penciptaan dan pertanyaan pengguna

  • Terbitkan, edit, pertanyaan, padam siaran

Struktur projek

├── server
│   ├── core // 核心业务逻辑
│   │   └── src
│   │       ├── domain
│   │       ├── repository
│   │       └── useCase
│   ├── koa
│   │   └── src
│   │       ├── post
│   │       └── user
│   └── nestjs-app
│       ├── src
│           ├── post
│           │   ├── dto
│           │   └── entities
│           └── user
│               └── entities
└── web
  • teras: teras ialah kod untuk logik perniagaan teras

    • Domain: menyimpan kod berkaitan entiti, seperti model khusus perniagaan, dsb.
    • Kes Penggunaan: menyimpan logik perniagaan Kod yang berkaitan, seperti memproses logik perniagaan, pengesahan data, memanggil Repositori, dll.
    • Repositori: storan dan antara muka yang berkaitan untuk sistem storan luaran
  • koa/nestjs- app: Pengguna sebenar teras

    • melaksanakan Penghala tertentu mengikut antara muka teras, Repositori

Ciri Projek

  • Gunakan idea DDD dan Clean Architecture untuk memisahkan logik perniagaan daripada pelaksanaan rangka kerja.
  • Gunakan struktur projek monorepo untuk mengurus berbilang projek berkaitan dengan mudah.
  • Berbilang aplikasi sampel disediakan untuk membantu anda bermula dengan cepat.
  • Berdasarkan TypeScript, meningkatkan kebolehbacaan dan kebolehselenggaraan kod.

Dalam teras, kami mempunyai kod logik perniagaan teras. Tahap ini mengandungi domain, antara muka repositori dan kes penggunaan. Domain mengandungi kod yang berkaitan dengan entiti, seperti model perniagaan tertentu. Repositori mengandungi antara muka yang berkaitan dengan sistem storan luaran. Kes penggunaan mengandungi kod yang berkaitan dengan logik perniagaan, seperti pengendalian logik perniagaan, pengesahan data dan repositori panggilan.

Di peringkat koa/nestjs-app, kami mempunyai pengguna sebenar di peringkat teras. Mereka melaksanakan penghala dan repositori tertentu berdasarkan antara muka yang disediakan oleh lapisan teras. Salah satu kelebihan utama menggunakan Seni Bina Bersih ialah ia memisahkan logik perniagaan daripada pelaksanaan teknikal. Ini bermakna anda boleh bertukar dengan mudah antara rangka kerja dan perpustakaan yang berbeza tanpa mengubah logik perniagaan teras. Dalam contoh kami, kami boleh bertukar antara koa dan nestjs-app sambil mengekalkan logik perniagaan teras yang sama.

Pelaksanaan kod

Tentukan lapisan entiti

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

Tentukan antara muka storan

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

Tentukan lapisan kes guna

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

projek koa

Laksanakan antara muka lapisan storan dalam projek 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");
  }
}

Melaksanakan penghalaan HTTP (lapisan pembentangan) dalam projek koa

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

projek nest-js

Contoh projek nestjs boleh didapati dalam laluan ini (github.com/lulusir/cle…Saya tidak akan menyiarkan kod di sini

Akhir sekali

Sila ambil perhatian bahawa dalam projek sebenar, kami tidak akan meletakkan logik perniagaan teras dalam gudang yang berasingan (iaitu teras), ini hanya untuk menunjukkan prestasi di bawah berbeza rangka kerja Gunakan logik perniagaan yang sama

Dengan memisahkan logik perniagaan daripada rangka kerja, anda boleh bertukar dengan mudah antara rangka kerja dan perpustakaan yang berbeza tanpa mengubah logik perniagaan teras. Jika anda ingin membina aplikasi berskala dan boleh diselenggara, Seni Bina Bersih pastinya patut dipertimbangkan.

Jika anda ingin menunjukkan cara menyambung ke rangka kerja lain, anda boleh mengemukakan

alamat projek di ruang ulasan (github.com/lulusir/cle… Rakan-rakan yang berpendapat ia bagus, Anda boleh memberi bintang, terima kasih

Untuk lebih banyak pengetahuan berkaitan nod, sila lawati: tutorial nodejs!

Atas ialah kandungan terperinci Apakah Seni Bina Bersih? Bagaimana untuk melaksanakannya dengan Node?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam