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
Đừ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.
Vâng bác, sau khi làm xong MVVM e hiểu rằng Repository quan trọng ntn rồi :love:
 
đồng ý với thím cuoc_song.

nhân tiện tôi thấy topic hay nên đưa ra một chút ý kiến:
một số ORM framework cho phép tận dụng entity kết hợp với kế thừa generic class để tạo ra repository, vẫn có thể sử dụng những method đã có sẵn của entity và tạo thêm custom method khi cần thiết ở trong repository
có lẽ do ORM framework của thớt không support tốt vụ này thôi
 
Như t làm mobile xài repository pattern. Sau t cần refactor từ MVP --> MVVM, t chỉ concern mỗi tầng presenter thôi còn lại repository vẫn không thay đổi. Rõ ràng có lợi là không phụ thuộc còn gì
 
đồng ý với thím cuoc_song.

nhân tiện tôi thấy topic hay nên đưa ra một chút ý kiến:
một số ORM framework cho phép tận dụng entity kết hợp với kế thừa generic class để tạo ra repository, vẫn có thể sử dụng những method đã có sẵn của entity và tạo thêm custom method khi cần thiết ở trong repository
có lẽ do ORM framework của thớt không support tốt vụ này thôi
Đồng ý với bác, thằng nestjs có support vụ này, và tôi kết hợp cả 2, cái nào đơn giản thì tôi xài trực tiếp orm, còn phức tạp thì tạo repo extend từ generic.
 
Anh tự viết Repository Pattern từ đầu với anh custom ORM để support cloud/xml/nosql là NHƯ NHAU!

Cái lợi của việc sử dụng trực tiếp ORM là tận dụng được đầy đủ chức năng của ORM đó, chứ ko phải mổi lần cần lại abstract nó lên repository.

Những dự án xài repository thì thấy toàn là khổ trước chứ lúc sướng thì thật sự tôi chưa thấy. Tới lúc cần đổi thì các anh re-implement lại repository cũng sml chứ ở đó mà sướng. Effort bỏ ra cũng y như custom ORM. :ah:
tôi vẫn thích custom orm hơn :)))
ModelEntity.Instance.CreatQuery().where....ToList():)):beauty:
 
Vậy khai sáng cho tôi đi anh. Thật sự tôi rất muốn biết anh có cái yêu cầu "thần thánh" nào mà ngay cả cái ORM nổi tiếng như Entity Framework của Microsoft cũng ko đáp ứng được anh.

Nếu thế thì anh tạo 1 cái framework riêng đạp đổ hàng Microsoft hay Hiberanate luôn đi.

Chứ nãy giờ các anh nói chung chung là có lợi nhưng đíu đưa dc cái ví dụ cụ thể nào. Vì thật sự vừa nghĩ tới thì nghĩ lại thằng ORM nó cũng làm dc luôn rồi. :look_down:

qZV215Z.png
Không liên quan - nhưng các thím sử dụng thằng SQLsugar của pháp sư trung hoa chưa?
Hay phết:ah:
 
Quan điểm của tôi về Repository pattern nó như này:
Định nghĩa: nơi đóng gói các phương thức liên quan đến việc access db => ở đây chỉ có các tác vụ liên quan đến việc access db (persistence layer). Có thể ném cái này vào service được không? được. Gọi nó là DAO có được không? Cũng được luôn.
ORM Java có Hibernate, .NET có EF, 2 thằng này đều có sẵn các method liên quan đến data access nên việc CÓ CẦN THIẾT PHẢI DÙNG Repository không? KHÔNG. Nhưng với những ai đã quen lối viết Repository, hoặc MUỐN VIẾT RÕ RÀNG các action liên quan đến Data access ra thì sao? Thì dùng Repository.
Chốt lại, Repository nó không phải thứ BẮT BUỘC PHẢI CÓ một khi đã có ORM. Nhưng nếu muốn nó rõ ràng (và thi thoảng là lười nữa, ví dụ như khi dùng JpaRepo) thì dùng Repo cũng được.
Bảo nó bullshit? không. Bảo nó là 1 thứ sinh ra từ ORM, đúng. Với tôi nó là 1 trong số các triển khai của KỸ THUẬT ORM (not an ORM Framework implementation)
 
Tức là ở tầng storage, thao tác với dữ liệu mình encrypt id, dữ liệu cần mask à thím?
Vậy khi mình gửi id đc mã hoá từ client lên, thì decrypt ở tầng nào ạ? Hay cũng service luôn?
Thím phải biết mask dữ liệu với đội tượng nào, ở layer nào thì mới xử lý được chứ.
 
Như tít. Theo tôi nó chẳng lợi lộc gì cả. Đẽ ra cho rách việc thêm. Thế mà đi dự án nào cũng thấy ng ta setup cái này.
jmEBCky.gif


Update từ #10:
Các anh đưa lý lẽ cho việc đổi databases để dùng Repository Pattern tôi càng thấy bullshit vì:

1. Bản thân ORM framework đã support rất nhiều loại database rồi.
2. Việc đổi database qua cái mới hoàn toàn mà ORM ko support như từ MSSQL sang MongoDB là cái chuyện trong thực tiễn rất hiếm xảy ra.

Chẳng có thằng điên nào đi đòi đổi db từ relation db sang Nosql chỉ bằng config cả.

Còn cái tào lao của thằng Repository Pattern mà dự án nào xài nó tôi cũng gặp là:

1. Code lặp lại những gì ORM đã làm như get, getall, save, update, delete… include.. join…
2. Khi gọi join giữa 2 repositories, hoặc cần quản lý transaction thì lại đi code lặp lại của thằng ORM. (Bullshit)
3. Toàn bộ những gì ORM support thì bị cái anh Repository Pattern này abstract lên hết nên nếu muốn xài thì phải code lặp lại, gọi lại của ORM (như vậy lại vô tình phụ thuộc vào chính ORM đó, ko còn abstract như ý tưởng ban đầu, bullshit lần 2)

Update:
Để tránh mọi sự hiểu lầm tôi đang nói cụ thể cách Implement Repository Pattern sử dụng Generic Repository như trong link này là bullshit khi đã có ORM:

https://docs.microsoft.com/en-us/as...f-work-patterns-in-an-asp-net-mvc-application

Theo cách dùng Generic Repository như này thì mổi repo tương ứng 1-1 với Entity. Lúc này nó implement ngu là ko có abstract ra IQueryable nên ko join/query đươc. Và quan trọng là useless vì đã có Ef rồi.

Còn anh nào implement Repository xem như Data Access Class trong mô hình 3 layers cổ điển thì tôi ko tranh cãi vì bản chất 2 design support 2 chuyện khác nhau:

1. Generic Repository là để abstract luôn cả cách query/update data cho từng entity type /table riêng lẽ. (việc mà ngày xưa chưa có ORM mới phải làm).

2. Data Access Class (trong 3 layers) là để gom các query logic, business rules. Dự án anh nào lớn thì xài 3 layers, dự án nào nhỏ thì xài 2 layers nhưng điểm chung là đều sử dụng ORM như dbContext, Hibernate session. Nhiều anh sử dụng tên DAL class là Repository luôn nên dễ hiểu lầm với cái implement Generic Repository kia.

https://www.thereformedprogrammer.net/is-the-repository-pattern-useful-with-entity-framework-core/

:misdoubt:
View attachment 1011739


ScTzgAa.png
Tôi chưa đọc hết thớt vì có thể toàn gạch anh(sẽ đọc), nhưng đầu tiên thì tôi đứng vê phía thớt trong việc bỏ Repository nếu dùng ORM , nhất là bọn session như Hibernate hay SQLalchemy, về bản chất session trong bọn này chính là Unit of work rồi, chúng ta chỉ gọi session chứ có biết mẹ gì phía sau cái ORM nó làm gì đâu.
 
Các anh còn trẻ nên khi các anh bắt đầu code, các anh tiếp cận với EF và vì thằng EF nó làm việc theo cách của nó như các anh đang thấy. Và các anh nghĩ nó là cả thế giới.

Rồi các anh quay lại chửi Repository Pattern như các hàm GetById, GetByName là ko cần thiết. Các anh đang bắn đại bác vào lịch sử phát triển phần mềm với tri kiến của các anh đấy.

Tui đã đưa ví dụ với NHibernate Session rồi. Các anh muốn biết thì thử học nó đi. Khi các anh làm việc với NHibernate Session thì các anh mới hiểu thế nào là Unit Of Work.

Và vì là Unit Of Work nên cần các hàm GetById để gói gọn và chấm dứt
Session/Transaction trong một Unit Of Work để nó không ảnh hưởng đến các tác vụ khác.

Tui ko phải chuyên gia Ef, nhưng hồi còn làm NHibernate thì trong 1 UnitOfWork tôi có thể gởi đồng thời nhiều query lên server cùng một thời điểm để tránh round trip rất hay. Mà giờ già rồi ko nhớ nó gọi là gì.

Và đó là cách làm việc của các ORM thời đó. (Và bây giờ?)
. Cho tới khi thằng EF ra đời. Nó hoạt động theo một cách hoàn toàn khác để tracking changes của Entity và loại bỏ khái niệm Session (hoặc nó có internal Session tui ko rành) nên Unit Of Work nó ko có ý nghĩa trong EF.

Một cái khác biệt lớn nhất khi làm việc với Ef là Repository không khởi tạo Singleton được. Trong khi NHibernate thì tạo Singleton Repository bình thường.

Các anh em làm Python, Php,... có thể chia sẻ Orm bên các ngôn ngữ đó hoạt động như thế nào? Nhưng tui đoán các anh em vẫn sẽ cần Repository Pattern với GetById hay GetByName.


Edit: Định trả lời anh Ếch ở dưới mà nghĩ. Đọc tới dòng addscoped inject vào singleton instance, tôi lắc đầu. Chắc hi vọng nó sẽ tự tạo instance mới của DbContext bằng phép màu. Rồi multi-theading kiểu gì, muli-user, parallel editing kiểu gì. Thôi tốn thời gian vô ích nên tui out topic. Bye bye anh em.
Tôi chưa dùng Hibernate , nhưng vẻ bôi đậm là eager load
 
Tôi chưa đọc hết thớt vì có thể toàn gạch anh(sẽ đọc), nhưng đầu tiên thì tôi đứng vê phía thớt trong việc bỏ Repository nếu dùng ORM , nhất là bọn session như Hibernate hay SQLalchemy, về bản chất session trong bọn này chính là Unit of work rồi, chúng ta chỉ gọi session chứ có biết mẹ gì phía sau cái ORM nó làm gì đâu.

tui cũng thấy hơi lạ khi Repo lại wrap cái UoW, sao ko để Domain Model nó xài trực tiếp UoW cho mọi ch nó nhẹ nhàng bớt
 
Pv laravel được hỏi có dùng repo không bảo không thế là họ bảo luôn chắc các dự án đã làm đều nhỏ phải không ?.
 
Pv laravel được hỏi có dùng repo không bảo không thế là họ bảo luôn chắc các dự án đã làm đều nhỏ phải không ?.
Có rớt cũng không cần quá tiếc, chỉ mấy con gà mới thở ra được câu đó thôi, có vào làm cũng không học hỏi được gì đâu :boss:
 
Back
Top