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.
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.).
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.
Laksanakan fungsi penerbitan dan penyemakan imbas siaran
Penciptaan dan pertanyaan pengguna
Terbitkan, edit, pertanyaan, padam siaran
├── 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
koa/nestjs- app: Pengguna sebenar teras
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.
// 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"); } }
// 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"); } }
// 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(); });
Contoh projek nestjs boleh didapati dalam laluan ini (github.com/lulusir/cle…Saya tidak akan menyiarkan kod di sini
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!