Hướng dẫn repository pattern nodejs - mô hình kho lưu trữ nodejs
Generic Repository PatternKhi làm việc với JavaScript chúng ta thường gặp phải vấn đề là việc share code giữa các app của chúng ta, chúng ta thường viết lại một đoạn code (lặp lại) ở một project khác. Pattern sẽ giúp chúng ta viết thành data abstraction, khi chúng ta có một hoặc nhiều class và việc tái sử dụng sẽ tốt và dễ dàng hơn. Show Nói về Repository Pattern đóng vai trò là một lớp kết nối giữa tầng Business và Model của ứng dụng (CRUD). Thông thường thì các phần truy vấn dữ liệu với database năm rải rác ở trong code nhưng với với Repository thì khi cần thực hiện các thao tác với database, nó không trực tiếp gọi tới database drivers và nếu chúng ta sử dụng nhiều database, hoặc nhiều database trong 1 transaction, app của bạn sẽ gọi thông qua các method được định nghĩa bởi Repository.Repository Pattern đóng vai trò là một lớp kết nối giữa tầng Business và Model của ứng dụng (CRUD). Thông thường thì các phần truy vấn dữ liệu với database năm rải rác ở trong code nhưng với với Repository thì khi cần thực hiện các thao tác với database, nó không trực tiếp gọi tới database drivers và nếu chúng ta sử dụng nhiều database, hoặc nhiều database trong 1 transaction, app của bạn sẽ gọi thông qua các method được định nghĩa bởi Repository. Cũng giống như vậy, nhưng Generic Repository thì chúng ta sẽ chỉ có 1 abstraction, 1 Base Class chứa tất cả những operations chung và EntityRepository của bạn sẽ extends base class. Theo như nguyên lý SOLID thì pattern này chính là Open / Closed principle. When to use a Generic Repository ?Điều này phụ thuộc vào Business model của bạn. Ý kiến của tôi (tác giả) thì pattern này sẽ chú trọng vào việc mở rộng và cho phép bạn dùng 1 class để viết tất cả các operations chung (thường dùng nhất) như CRUD. When don’t use Generic Repository ?Cùng xem ví dụ cụ thể sau:
Nếu cả 2 class trên đều extend từ base class (có methods update và delete) như vậy thì bussiness logic của bạn sẽ không còn đúng nữa. Generics with Typescript
Theo như documentation của Typescript thì generics cho phép bạn build một flexible component (hoặc type). Chúng ta cùng xem qua ví dụ để hiểu hơn:
Như trên, Chúng ta có một function cố định. Nó nhận vào một số và trả về kết quả là số đó (cùng type). Nếu chúng ta muốn nó nhận argument là một string chẳng hạn thì chúng ta phải viết một function khác với code implement tương tự (lặp code). Với việc implement Generics thì chúng ta làm như sau:
Nếu bạn không quan tâm tới type của argument truyền vào thì có thể dùng 7 thay cho 8.Creating a real project with Generic Repository and Node.jsSau khi cài đặt môi trường xong, chúng ta cùng chia thư mục như sau cho dễ quản lý:
Phần config trong file tsconfig.json, mọi người có thể tham khảo ở đây Về folder 9 là nơi chứa model của app, 0 là nơi chứa các operations tương tác với database. Bây giờ chúng ta cùng tạo model có tên là 1:
Bây giờ trong folder 2, chúng ta tạo 2 files với nhiệm vụ là read và write:
Sau khi tạo interface xong, chúng ta tạo base class để implements những operations trên và áp dụng cho tất cả các model của app. Tạo file 3:
Chúng ta cần tạo phần implement cho tất cả các methods trên. We should now create the implementations for all methods. Trong constructor (hàm khởi tạo), chúng ta thêm 2 args là db và collectionName:
Bây giờ chúng ta tạo Repository file cho từng model cụ thể:
Để test repository trên và logic của nó chúng ta tạo file 4 ở thư mục gốc của project và gọi repository đó:
Để chạy được app chúng ta cần chạy câu lệnh 5 hoặc 6 ở terminal để transpile từ Typescript sang js file. Sau đó thì chạy 7.Để thấy rõ hơn tác dụng của việc dùng pattern này chúng ta sẽ tạp thêm 1 repository nữa có tên là 8 và 1 model là 9: 0 1Giờ thì gọi nó ở trong file 0: 2ConclusionTrên đây là một ví dụ áp dụng Repository design pattern trong ứng dụng Nodejs với Typescript (Generic). Khi bắt đầu học Nodejs mình cũng bắt đầu với Typescript để tiện cho việc học design pattern (ví dụ như áp dụng cho mailer,...). Happy coding ! (ví dụ như áp dụng cho mailer,...). Happy coding !Referenceshttps://hackernoon.com/generic-repository-with-typescript-and-node-js-731c10a1b98e |