SETS-VN / web_platform

this places store SETS web platform
0 stars 0 forks source link

Deep understand of DDD Repository #3

Closed nghuyenthevinh2000 closed 7 months ago

nghuyenthevinh2000 commented 3 years ago

Định nghĩa repository theo chuẩn của DDD (trích từ sách DDD Quickly ) là:

Repository được sử dụng để có được một object reference. Repository là một trong 3 thành phần quản lý life cycle của một Object:

  1. Aggregate: Là một cấu trúc giúp định nghĩa rõ quyền sở hữu và ranh giới của một Object.
  2. Factory: Tạo ra một Aggregate hoặc một Object.
  3. Repository: Quản lý liên kết tới Aggregate hoặc Object đó.

Ở trong phần này sẽ giải thích rõ về DDD Repository.

Câu chuyện sẽ là như sau: Trong database của ta chứa dữ liệu về một Object. Có 3 chương trình code khác nhau muốn sử dụng Object này, nếu như mỗi chương trình viết code riêng để lấy Object trực tiếp từ Database thì sẽ tạo ra 3 instance khác nhau liên kết tới Object. Và nếu có n chương trình code khác nhau thì sẽ tạo ra n instance khác nhau liên kết tới Object.

Nếu như cấu trúc của Object thay đổi, ta sẽ phải thay đổi code của n chương trình để phù hợp với cấu trúc Object mới.

Do đó, Repository ra đời để quản lý liên kết tới Object. Ý tưởng là chỉ có một mình Repository đại diện cho n chương trình được phép add, find, remove, update, change, ... Object.

nghuyenthevinh2000 commented 3 years ago

Screenshot 2021-05-15 001440

Ở phần code của ông. Các file sau là tương đồng nhau:

  1. /repository/repository-interface.ts = /application/IDatabase.ts
  2. /repository/contact-repository.ts = /application/Database.ts

repository là một thành phần trong application layer cho nên nó sẽ phải nằm trong folder application. /repository/repository-factory.ts là một factory để đảm bảo chỉ có thể truy cập vào duy nhất một instance của repository.

phần /entity thuộc về thông tin contact_form. Do database phải chấp nhận được nhiều kiểu cấu trúc hơn nữa. Ta sẽ không làm Database tổng quát nữa mà tạo ra một repository cho Entity contact_form. Một cấu trúc mới cho contact_form sẽ được tạo ra.

phần /lib thuộc về Application Adapter. Các File trong đây sẽ được di chuyển về /application/adapter

phần /prisma thuộc về Infrastructure layer. Các File trong đây sẽ được di chuyển về /infrastructure/prisma