Đã từng apply cái repository pattern này và đã từ bỏ vì theo cá nhân mình thấy:
1. Việc đổi giữa các database sql (mysql, postgresql, ...) thì ORM đã hỗ trợ. Việc đổi từ sql sang nosql là vô cùng hy hữu (phải đổi cả đống data cũ hoặc có cơ chế tận dụng đống data cũ đó mà 1 khi nghĩ đến chuyện đổi database thì lượng data cõ lẽ sẽ phải rất lớn đến nỗi database hiện tại không gánh nổi hoặc vì lý do đặc biệt khác). Để đánh đổi khả năng rất nhỏ đổi database mà ngay từ ban đầu đã phải thêm 1 layer (thêm code) thì nếu là mình mình sẽ không chọn.
2. Rất khó để flexible bằng ORM, hầu hết các ORM đều có query interface rất bá mà mình nghĩ rất khó 1 team nào có thể tự làm ngon bằng. 1 function trong repository theo thời gian có thể có nhiều nơi khác nhau sử dụng và có thể thêm bớt các param khi đó cần update lại function trong repossitory và có thể phải đổi cả những nơi đã implement function đó, nếu không muốn thêm bớt cacs param khi phát sinh thì phải viết function mới trong repository.
3. Phức tạp và rườm rà, phải apply unit of work.
4. Không liên quan đến cache như một số người nói => vote dùng event để xử cache ở 1 nơi khác.
5. ORM cũng mock test được.
6. Khi apply aggregate pattern thì repository cũng không phải là điều bắt buộc phải có.
// Vẫn hóng thêm lý do để sử dụng repository