thảo luận [Thảo luận] Repository Pattern là cái bullsh*t nhất khi đã có ORM framework?

Có nên sử dụng repository pattern khi đã có ORM framework rồi ko?

  • Có - có lợi nhiều lắm để tôi cmt bên dưới

    Votes: 29 19.2%
  • Có - thấy người ta hay xài thì mình xài thôi (chắc là cũng có lợi gì đó nhưng dek biết)

    Votes: 25 16.6%
  • Không - tốn công vô ích, đẽ ra cho thêm việc phức tạp chứ ko lợi lộc gì đáng kể

    Votes: 19 12.6%
  • Không - code nhiều mệt vãi, xài trực tiếp ORM cho nhanh (cũng ko biết là có lợi hay ko)

    Votes: 21 13.9%
  • Tuỳ - tuỳ dự án, tuỳ yêu cầu

    Votes: 57 37.7%

  • Total voters
    151
Vậy thì sẽ gặp trường hợp các services bị lồng nhau:( mình chưa gặp trường hợp này bao giờ, nhưng nghe nói là nên tránh :ah:

Bác có thể nói thêm 1 xíu về vấn đề này được không :love:
Cách này thì phải chú ý chổ quản lý transaction để đảm bảo sopce của nó đúng như mong đợi vì nó gọi lồng nhau :love:
gọi cross service là bình thường thôi có gì đâu mà cần tránh bạn
 
Ai nói repo pattern chỉ nên trả về nguyên cái domain class. A muốn projection bao nhiêu fields thì cứ việc select đúng fields ở dưới thôi. Nhìn từ thằng services nó chỉ xem như domain object, có thể full fields hoặc ít fields tuỳ vào business rules.

Chính vì lẽ đó nên đa số các Generic Repository support full fields entity và các hàm rất cơ bản thì cũng ít được sử dụng, code nhiều mà xài ko bao nhiêu. Cùng lắm xài được cái hàm GetById, GetbyName

"The more code is reusable is the more code is not usable"
Vậy phải build ntn chứ DTO hay ViewModel đâu thể ở tầng Domain dc.
 
Vậy thì sẽ gặp trường hợp các services bị lồng nhau:( mình chưa gặp trường hợp này bao giờ, nhưng nghe nói là nên tránh :ah:

Bác có thể nói thêm 1 xíu về vấn đề này được không :love:
Cách này thì phải chú ý chổ quản lý transaction để đảm bảo sopce của nó đúng như mong đợi vì nó gọi lồng nhau :love:
thì a tách ra thui. những cái này nó chỉ là concept. tuỳ tình hình mà apply hay k, apply thế nào. trên đây nghe chém gió cho biết thui chứ a tin và làm theo vozer à??
 
thì a tách ra thui. những cái này nó chỉ là concept. tuỳ tình hình mà apply hay k, apply thế nào. trên đây nghe chém gió cho biết thui chứ a tin và làm theo vozer à??
Thao khảo ý kiến để có thêm xíu exp thoi bác oiii :p trước mình cũng chả care mấy cái này lắm, gặp thớt này mới ngồi review lại :love: thấy thú vị thật :love:
 
Thao khảo ý kiến để có thêm xíu exp thoi bác oiii :p trước mình cũng chả care mấy cái này lắm, gặp thớt này mới ngồi review lại :love: thấy thú vị thật :love:
thì tham khảo thui. còn chuyện bác hỏi thì tách hay k là do tình hình và ý kiến mn. ông kia thấy bth còn mình khác thì cũng bth nốt.

cần j phải theo 1 ý kiến trên mạng ẩn danh ntn mà phải tranh cãi
 
thì tham khảo thui. còn chuyện bác hỏi thì tách hay k là do tình hình và ý kiến mn. ông kia thấy bth còn mình khác thì cũng bth nốt.

cần j phải theo 1 ý kiến trên mạng ẩn danh ntn mà phải tranh cãi
Mình hỏi tham khảo bình thường mà, có tranh cãi gì đâu nhỉ :sweat::sweat:
 
Vậy phải build ntn chứ DTO hay ViewModel đâu thể ở tầng Domain dc.

1. Domain model là cái liên quan tới business rules. Cái này nghiệp vụ cần gì thì lấy cái đó thôi. Gọi chính xác là business object. Cái này thường ở tầng service và là object trả ra và save xuống khi giao tiếp với Repository.

2. View Model là object làm việc với phần presentation. Một vài dự án đơn giản có thể lấy luôn business object còn ko thì tạo cái mới bằng cách mapping, inheritance, composition từ thằng này để phù hợp với cái view. Lúc này việc mapping phải thực hiện ở controller khi lấy obj từ service phải map nó qua view model.

Cá nhân tôi thì lấy business object xài luôn. Move toàn bộ business object và Interface ra common để xài chung cho cả 3 tầng, dek phải map gì cả.

3. Tương tự thằng Data Access Object (Dao) hay bên .Net nó gọi là Entity là thằng gần với database nhất là ở trong Repository và trước khi trả ra service thì nó phải map từ DAO/Entity về business object.

Trong setup này thì domain service là core nên tôi mới nói move toàn bộ business object/interface ra common để 2 tầng presentation với database có đổi thì core vẫn ko đổi.
 
Last edited:
Lười lội ngược topic, mình chỉ muốn hỏi thớt là nếu không có lớp abstract mà repository mang lại thì bác thớt viết integration test như thế nào? (Nếu cái InMemoryDatabase Provider không hỗ trợ tốt cho cái database đang dùng)
 
Lười lội ngược topic, mình chỉ muốn hỏi thớt là nếu không có lớp abstract mà repository mang lại thì bác thớt viết integration test như thế nào? (Nếu cái InMemoryDatabase Provider không hỗ trợ tốt cho cái database đang dùng)

Integration test thì clone nguyên cái db ra test thật luôn. Chỉ test service.

Cái này đảm bảo test service nào là chắc thằng đó. Insert xuống db rồi query lên check lại luôn.
zFNuZTA.gif


via theNEXTvoz for iPhone
 
Microsoft cũng nói return IQueryable phá vỡ cấu trúc Repo.
A key point to note is that our GetAllBlogs method returns IEnumerable<Blog>, and not IQueryable<Blog>. Returning the latter would mean that query operators can still be composed over the result, requiring that EF Core still be involved in translating the query; this would defeat the purpose of having a repository in the first place

https://docs.microsoft.com/en-us/ef/core/testing/testing-without-the-database

Ngoài ra mình cũng hỏi là trong t/h dùng repo, nếu câu query mình muốn select field cần thiết, ko select all domain thì phải làm sao.
Thanks
Xây dựng cấu trúc Enum có sử dụng Flag để thực hiện việc này. https://docs.microsoft.com/en-us/dotnet/api/system.flagsattribute?view=net-6.0
Việc select field, sử dụng bitwise OR để xác định field nào được chọn field nào không
 
Tất cả những việc đó làm ở tầng service. Service sẽ dùng dbContext để thao tác với db hoặc gọi service khác.

ORM cũng support gọi raw sql, stored procedure hết rồi. Thậm chí nó cho custom luôn, muốn implement cái quái gì cũng dc nên chuyện đổi db coi như xong nhé.

Còn các a cố cãi là đổi ORM luôn thì cũng chẳng có ý nghĩa gì vì so với việc custom ORM và re-implement lại các repository khi có yêu cầu thay đổi là như nhau.

via theNEXTvoz for iPhone
Vậy biz logic thường sẽ ở tầng service, lúc đó nó đc nhập chung vs DB contexxt và cách access query của Orm ha bác ??? - Cái mà service đáng ra là ko thèm quan tâm.

Bác sẽ nói vậy tao xài method/func abstraction để đẩy cách query access data ra 1 method riêng ở service cũng đc-> ok đỡ hơn đc xíu rồi. Nhưng bác biết đấy cách nhiệm vụ chi tiet query data thế nào thường là ko phải là nhiệm vụ của tầng service thì bác để đó mất tính isolation và single responsibility. Tầng service nó thường chỉ thể hiện flow của dữ liệu và sát với usecase. Chứ ko thể hiện chi tiết cách mà bác sẽ query data ra sao.

Ko lẽ tôi đọc code ở service lại phải hiểu cái Orm của bác xài api của nó ntn cách tương tác để build đc query vs nó như thế nào và handle edge case có j cần lưu tâm???

Nhưng nói đi cũng phải nói lại. Nếu tầng service chả có biz logic j mà chỉ đơn thuần là wrap lại repository thì thôi như bác nói cũng đc.


Sent from Calitus via nextVOZ
 
Last edited:
Vậy biz logic thường sẽ ở tầng service, lúc đó nó đc nhập chung vs DB contexxt và cách access query của Orm ha bác ??? - Cái mà service đáng ra là ko thèm quan tâm.

Bác sẽ nói vậy tao xài method/func abstraction để đẩy cách query access data ra 1 method riêng ở service cũng đc-> ok đỡ hơn đc xíu rồi. Nhưng bác biết đấy cách nhiệm vụ chi tiet query data thế nào thường là ko phải là nhiệm vụ của tầng service thì bác để đó mất tính isolation và single responsibility. Tầng service nó thường chỉ thể hiện flow của dữ liệu và sát với usecase. Chứ ko thể hiện chi tiết cách mà bác sẽ query data ra sao.

Ko lẽ tôi đọc code ở service lại phải hiểu cái Orm của bác xài api của nó ntn cách tương tác để build đc query vs nó như thế nào và handle edge case có j cần lưu tâm???

Nhưng nói đi cũng phải nói lại. Nếu tầng service chả có biz logic j mà chỉ đơn thuần là wrap lại repository thì thôi như bác nói cũng đc.


Sent from Calitus via nextVOZ
frog friend đang kéo ae lại thời code những năm 2 ngàn, 1 file php, 1 file asp làm tất mọi việc

fen nhìn nó dùng 1 object cho cả entity lẫn input ở FE api call là thấy rồi. tôi theo dõi thớt này lâu rồi, tôi thấy nó làm cho các cty phèn quá. Tính toán rất tù, tiết kiệm mấy dòng code mà phá mẹ nó architect

project của tôi mà trong service lòi ra cái DbContext thì nghỉ cho khoẻ nếu ko cho tôi đập đống đấy đi
 
Tôi ko trách các a chửi tôi. Tới khi các anh kinh qua rất rất nhiều dự án rồi thì các anh mới “ngộ”.

Cái mô hình các anh đanh làm là chỉ thích hợp cho monolithic applications. Và nó mang lại những thứ phức tạp ko cần thiết.

Đó là lý do Microservices ra đời thay vì 1 hệ thống phức tạp nhiều tầng thì nó tách thành nhiều services độc lập và ít tầng hơn.

Cái đáng nói là rất nhiều hệ thống cũng ko phức tạp tới mức phải tách thành Microservices, nhưng cũng ko phức tạp để làm thành nhiều tầng.

via theNEXTvoz for iPhone
 
Tôi ko trách các a chửi tôi. Tới khi các anh kinh qua rất rất nhiều dự án rồi thì các anh mới “ngộ”.

Cái mô hình các anh đanh làm là chỉ thích hợp cho monolithic applications. Và nó mang lại những thứ phức tạp ko cần thiết.

Đó là lý do Microservices ra đời thay vì 1 hệ thống phức tạp nhiều tầng thì nó tách thành nhiều services độc lập và ít tầng hơn.

Cái đáng nói là rất nhiều hệ thống cũng ko phức tạp tới mức phải tách thành Microservices, nhưng cũng ko phức tạp để làm thành nhiều tầng.

via theNEXTvoz for iPhone
Thợ code 10 năm, trải qua thượng vàng hạ cám các loại dự án, từ banking, payment gateway đến hàng không, commerce cho đến mấy con cms cùi bắp. Thế đủ nhiều chưa :(
Mà anh nhầm mẹ 2 cái term layer và tier cmnr :(
 
Thợ code 10 năm, trải qua thượng vàng hạ cám các loại dự án, từ banking, payment gateway đến hàng không, commerce cho đến mấy con cms cùi bắp. Thế đủ nhiều chưa :(
Mà anh nhầm mẹ 2 cái term layer và tier cmnr :(

Uh layer cho nó chuẩn nhể. Ko lại chửi tôi.

Anh kinh nghiệm như thế. Thế anh đã “ngộ” ra chưa?

Trong tất cả dự án suốt 10 năm qua có dự án nào a đã tận dụng lợi thể của layer Repository như đổi ORM chưa? Giờ thử tưởng tượng ko có layer đó thì có dễ thở hơn ko.

À còn unit test thì sao? Các dự án a làm có mock toàn bộ Repo để unit test service và mock toàn bộ EF để unit test repo?


via theNEXTvoz for iPhone
 
Uh layer cho nó chuẩn nhể. Ko lại chửi tôi.

Anh kinh nghiệm như thế. Thế anh đã “ngộ” ra chưa?

Trong tất cả dự án suốt 10 năm qua có dự án nào a đã tận dụng lợi thể của layer Repository như đổi ORM chưa? Giờ thử tưởng tượng ko có layer đó thì có dễ thở hơn ko.

À còn unit test thì sao? Các dự án a làm có mock toàn bộ Repo để unit test service và mock toàn bộ EF để unit test repo?


via theNEXTvoz for iPhone
A buồn cười, có câu nào tôi bảo là dùng Repo để switch sang db khác chưa? Đọc lại mấy cái cmt của tôi đi
Còn việc UN thì liên quan mẹ gì ở đây, a có vứt cái dbContext vào business service hay Repo thì lúc viết UN a vẫn phải mock cho nó. Đùa đọc vài cái cmt của a thấy hiểu biết vl, vài cái thì ngáo đ chịu dc 🤨
 
thực lòng mà nói, 1 cái project chẳng lẽ chỉ có mỗi 1 những cái CRUD, getById đơn giản...
Sẽ có những câu query phức tạp, handle transaction etc. và chuyện xài trực tiếp DbContext sẽ dẫn tới leaky abstraction khắp nơi...
Mình vẫn thích thin controller với mediator pattern ở Application Layer, với các service xử lý business, input từ các repository hơn là kéo các logic query, CRUD data từ Data Layer lên ( mình đang nói về n-tier, Hexagon hay Clean architecture)
 
Newbie xin phêp chia sẻ 1 vài suy nghĩ về Repository pattern.

E chưa có nhiều cơ hội làm với Repo ở mảng khác nên ko rõ nó có bullshit hay ko nhưng lúc e học code cho Android, xem qua nhiều ví dụ MVVM thì thấy cả Google và rất nhiều prj khác trên git hay medium gần như prj nào e cũng thấy có sự kết hợp với Repo để xử lý logic việc lấy dữ liệu từ local hay remote.

Nếu so sánh với MVP thì e thấy Repo ở MVVM khá giống với Presenter, cả 2 đều cùng có nhiệm vụ xử lý logic phân luồng các kiểu. Cho nên lúc refactor từ MVP sang MVVM e thấy rằng nếu bỏ Repository đi thì ko biết đưa phần xử lý logic vào đâu, nếu đưa logic vào View để xử lý thì code trông rất bẩn, nên lúc này Repo là giải pháp buộc phải dùng.

Và đồng ý với chủ thớt 1 điều Repository khiến cho code bị lặp lại, e cũng thấy khá khó chịu khi tại sao lặp code từ Repo cho đến ViewModel, chính prj mẫu của Google post cũng lặp code y chang nhau, ko hiểu tại sao nhưng e vẫn quyết tâm làm thử MVVM mà bỏ Repo ra xem có chạy dc ko, kết quả là ko chạy dc, ko thể nào dùng ViewModel vừa xử lý logic xong vừa nhận data trong 1 cùng 1 class (or có thể làm đc nhưng e ko biết cách triển khai MVVM without Repo).

Ko biết có bác nào ở đây làm Android MVVM mà bỏ Repo chạy tốt ko nhỉ :)
 
Newbie xin phêp chia sẻ 1 vài suy nghĩ về Repository pattern.

E chưa có nhiều cơ hội làm với Repo ở mảng khác nên ko rõ nó có bullshit hay ko nhưng lúc e học code cho Android, xem qua nhiều ví dụ MVVM thì thấy cả Google và rất nhiều prj khác trên git hay medium gần như prj nào e cũng thấy có sự kết hợp với Repo để xử lý logic việc lấy dữ liệu từ local hay remote.

Nếu so sánh với MVP thì e thấy Repo ở MVVM khá giống với Presenter, cả 2 đều cùng có nhiệm vụ xử lý logic phân luồng các kiểu. Cho nên lúc refactor từ MVP sang MVVM e thấy rằng nếu bỏ Repository đi thì ko biết đưa phần xử lý logic vào đâu, nếu đưa logic vào View để xử lý thì code trông rất bẩn, nên lúc này Repo là giải pháp buộc phải dùng.

Và đồng ý với chủ thớt 1 điều Repository khiến cho code bị lặp lại, e cũng thấy khá khó chịu khi tại sao lặp code từ Repo cho đến ViewModel, chính prj mẫu của Google post cũng lặp code y chang nhau, ko hiểu tại sao nhưng e vẫn quyết tâm làm thử MVVM mà bỏ Repo ra xem có chạy dc ko, kết quả là ko chạy dc, ko thể nào dùng ViewModel vừa xử lý logic xong vừa nhận data trong 1 cùng 1 class (or có thể làm đc nhưng e ko biết cách triển khai MVVM without Repo).

Ko biết có bác nào ở đây làm Android MVVM mà bỏ Repo chạy tốt ko nhỉ :)
Đừng có hiểu rằng nó lặp code. Hãy hiểu rằng nó cung cấp thêm 1 không gian tùy biến mới, để khi bạn có thay đổi về nghiệp vụ thì bạn có thể bổ sung, chỉnh sửa ít nhất mà vẫn đảm bảo tính thống nhất của cấu trúc.
Còn dăm ba cái lệnh call lặp lại có phải vấn đề gì đâu.
 
Back
Top