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

Pepe.The.Frog

Senior Member
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:
1644565256099.png


ScTzgAa.png
 
Last edited:
Đâu phải cái nào cũng Orm được đâu. Nhiều khi phải viết sql cụ thể để tối ưu nữa

À cái này là chuyện khác. Cái tôi muốn bàn là chuyện build 1 layer Repository Pattern phía trên rồi gọi lại ORM db context/session..

Còn chuyện dùng draw sql bên cạnh ORM thì tôi đồng ý cũng có lúc cần tới những chả cần đẽ ra cái repository pattern lam gi.

via theNEXTvoz for iPhone
 
phải cái này ko: https://stackoverflow.com/questions/10155517/repository-pattern-vs-orm

The repository abstract persistence access, whatever storage it is. That is its purpose. The fact that you're using a db or xml files or an ORM doesn't matter. The Repository allows the rest of the application to ignore persistence details. This way, you can easily test the app via mocking or stubbing and you can change storages if it's needed. Today you might use MySql, tomorrow you'll want to use NoSql or Cloud Storage. Do that with an ORM!

đọc thấy thì có lẽ đây là thêm 1 layer of indirection, để xài đủ kiểu db bên dưới, ko nhất thiết phải là sql. Orm cũng là 1 layer of indirection cho cái loại sql như mysql/sqlite/postgresql,mssql,oracle v.v... Cái repository này là thêm 1 layer of indirection cho các loại db khác nhau luôn, sql, nosql, xml, v.v... Có câu "All problems in computer science can be solved by another level of indirection" cứ thêm con trỏ tới con trỏ tới con trỏ là giải quyết được hết, ko giải quyết được thì thêm con trỏ tới con trỏ tới con trỏ tới con trỏ
WawmAwM.png


nói thêm, cần thêm 1 layer như vậy nữa để "đi tắt đón đầu". Viết code cái khó nhất ko phải là viết ra code chạy được mà là viết ra phần mềm dễ ứng phó với thay đổi. Business phát triển thì yêu cầu nó thay đổi liên tục, nay nó đòi mysql làm db, mai nó đòi mariadb, mốt nó đòi postgres thì anh xài orm, ví dụ đổi vài dòng orm config là đổi được khỏe re chẳng hạn. Nhưng rồi tháng sau nó bỏ sql đòi nosql v.v.. thì cái orm ko support nosql chẳng hạn thì anh lại phải viết code mới hoàn toàn... Nếu ngay từ đầu anh xài repo pattern này thì nó bao hàm luôn tất cả, lúc đầu anh viết code khổ nhưng về sau phẻ re. Đương nhiên tương lai ko ai nói trước được điều gì, có khi nó ko bắt thay đổi 180 độ như vậy thì công lao ban đầu của anh cũng coi như là insurance cho tương lai ấy mà
aVVa2xy.png
 
Last edited:
phải cái này ko: https://stackoverflow.com/questions/10155517/repository-pattern-vs-orm



đọc thấy thì có lẽ đây là thêm 1 layer of indirection, để xài đủ kiểu db bên dưới, ko nhất thiết phải là sql. Orm cũng là 1 layer of indirection cho cái loại sql như mysql/sqlite/postgresql,mssql,oracle v.v... Cái repository này là thêm 1 layer of indirection cho các loại db khác nhau luôn, sql, nosql, xml, v.v... Có câu "All problems in computer science can be solved by another level of indirection" cứ thêm con trỏ tới con trỏ tới con trỏ là giải quyết được hết, ko giải quyết được thì thêm con trỏ tới con trỏ tới con trỏ tới con trỏ
WawmAwM.png

Đó chính xác là những gì thằng ORM như Entity Framework nó support rồi. ORM bây giờ thằng nào cũng support nhiều loại database.

Còn chuyện đổi ORM framework cho 1 dự án đã setup rồi trong thực tiễn là rất hiếm nên chả cần phải xài Repository Pattern cho rách việc vì effort bỏ ra chỉ để support chuyện “nhỡ sau này đổi ORM” thì tôi thấy bullshit quá. Thậm chí việc đổi loại database cũng là chuyện hiếm.

via theNEXTvoz for iPhone
 
Đó chính xác là những gì thằng ORM như Entity Framework nó support rồi. ORM bây giờ thằng nào cũng support nhiều loại database.

Còn chuyện đổi ORM framework cho 1 dự án đã setup rồi trong thực tiễn là rất hiếm nên chả cần phải xài Repository Pattern cho rách việc vì effort bỏ ra chỉ để support chuyện “nhỡ sau này đổi ORM” thì tôi thấy bullshit quá. Thậm chí việc đổi loại database cũng là chuyện hiếm.

via theNEXTvoz for iPhone
tôi add thêm rồi đó. Nói chung đây là 1 kiểu như insurance cho các thay đổi trong tương lai ấy. Có thể bây giờ anh thấy bullshit nhưng 5 năm 10 năm mấy thằng khác vật vã thì anh phẻ re. Có lẽ người ta ko biết tương lai nó thay đổi yêu cầu gì, nên xài cái generic nhất để đón đầu thoy
pzGVwuf.png


ví dụ anh viết sql cho mysql only, thằng lead đòi orm cho mọi loại sql, anh chửi vẽ chuyện, nhưng tương lai 10 năm nữa oracle nó giết mysql lại phải đổi sang postgres thì sao, orm nó đỡ cho anh hết. Lúc thay đổi đó anh ko phải chuyển code mysql trong 10 năm đó thành code postgresql. Cái repo pattern này có lẽ tương tự.
 
@Pepe.The.Frog anh thấy ko cần thì ko xài thôi. Ráng cố gắng lên chức Lead hay Software Architect rồi bỏ hết cái Repository Pattern đi là được.

Còn tôi chỉ có cái case như vầy mới làm hôm qua. Tui có tài khoản Msdn Enterprise. Muốn làm cái database để quản lý đống license key. Một product có nhiều product keys. Tức là 1:n.

Giờ tui muốn có 1 hàm nhận vào Product. Trong object Product đó có cái List của Product Keys. Hàm đó lưu Product vào bảng Products, lưu Product Keys vào bảng ProductKeys với ProductId. Rồi giờ tui bỏ cái hàm đó ở đâu đây nếu ko bỏ vào Repository?

Repository Pattern và Orm Framework về ý nghĩa nó chả cùng một loại. Như đũa với chén. Chả hiểu tại sao lại kêu có đũa rồi ko cần chén ăn cơm?
 
Last edited:
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)


via theNEXTvoz for iPhone
 
Last edited:
Chẳng có thằng điên nào đi đòi đổi db từ relation db sang Nosql chỉ bằng config cả.
thế mới là cái đẹp của repo pattern này
QwJ0V0V.png
như thuốc tiên chữa từ sida tới tâm thần đều được, anh xài thuốc kháng sinh chi nữa chỉ diệt được vi khuẩn.

The repository abstract the access to all storage concerns, while the ORM abstract access to a specific RDBMS

đấy nó bảo repo pattern bao trùm rộng hơn orm, thì thằng lead/customer nó chọn repo cũng hợp lý có gì đâu, thằng implement là anh khổ thì kệ mẹ anh
qZV215Z.png


à thêm cái nữa nhớ tới Texas có tuyết dày thì bị cúp điện. Chắc mấy anh thiết kế nhà máy điện cũng như anh, ở Texas nóng có tuyết dày bao giờ đâu thiết kế chống bão tuyết làm gì, tiết kiệm chi phí. Tới lúc bão tuyết thì cúp điện chết người
4YMgKo2.gif
 
@Pepe.The.Frog anh thấy ko cần thì ko xài thôi. Ráng cố gắng lên chức Lead hay Software Architect rồi bỏ hết cái Repository Pattern đi là được.

Còn tôi chỉ có cái case như vầy mới làm hôm qua. Tui có tài khoản Msdn Enterprise. Muốn làm cái database để quản lý đống license key. Một product có nhiều product keys. Tức là 1:n.

Giờ tui muốn có 1 hàm nhận vào Product. Trong object Product đó có cái List của Product Keys. Hàm đó lưu Product vào bảng Products, lưu Product Keys vào bảng ProductKeys với ProductId. Rồi giờ tui bỏ cái hàm đó ở đâu đây nếu ko bỏ vào Repository?

Repository Pattern và Orm Framework về ý nghĩa nó chả cùng một loại. Như đũa với chén. Chả hiểu tại sao lại kêu có đũa rồi ko cần chén ăn cơm?

Tôi sẽ trả lời mọi câu hỏi của a sau. Giờ đi ngủ đã. Tốt nhất là a post code lên luôn.

P/s cho các anh khác:

Tôi sẽ tiếp tất cả các anh nào còn chém về cái sự “hữu ích” của Repository ngoài việc đổi db và ORM (vốn là 1 việc rất hiếm và thực tế hỏi 1 câu thật lòng mà tôi biết chắc câu trả lời là: “các a đã gặp dự án thực tế nào đang chạy rồi có yêu cầu đổi db như vậy chưa?” Đổi qua db khác tới mức mà ORM ko support?

Tôi đồng ý Repository Pattern chỉ có lợi DUY NHẤT 1 việc là đổi DB và ORM nhưng tác hại thì rất nhiều và ko đáng.

via theNEXTvoz for iPhone
 
Một số ORM như Entity Framework cho phép custom database provider luôn. Như vậy bản thân thằng Entity Framework chính nó đã implement Repository Pattern rồi!

Nên các anh làm thêm cái Repository Pattern để build on top là hết sức bullshit.

via theNEXTvoz for iPhone
 
Nếu chỉ dùng orm thì bỏ repo cũng được. Nhưng dự án đâu chỉ có vậy. Data có thể lấy từ db qua storeprocedure, viết raw query để tối ưu, có khi phải call api này nọ 🤔
 
Nếu chỉ dùng orm thì bỏ repo cũng được. Nhưng dự án đâu chỉ có vậy. Data có thể lấy từ db qua storeprocedure, viết raw query để tối ưu, có khi phải call api này nọ 🤔

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
 
Last edited:
@Pepe.The.Frog ừ anh trả lời tui câu trên.

Rồi có một cái case nhỏ khác. Ví dụ tui có cái Entity Product. Nó có ExpiredDate và IsDisable.

Giờ tui muốn lấy valid products list. Tui tạo một hàm trong Repository để kiểm Expired Date > DateTime.Now và IsDisable = false.

Tui gọi hàm này ở chục cái Services.

Giờ bỏ Repository rồi hổng lẽ tui copy code ra chục vị trí khác ở tầng Service?
 
@Pepe.The.Frog ừ anh trả lời tui câu trên.

Rồi có một cái case nhỏ khác. Ví dụ tui có cái Entity Product. Nó có ExpiredDate và IsDisable.

Giờ tui muốn lấy valid products list. Tui tạo một hàm trong Repository để kiểm Expired Date > DateTime.Now và IsDisable = false.

Tui gọi hàm này ở chục cái Services.

Giờ bỏ Repository rồi hổng lẽ tui copy code ra chục vị trí khác ở tầng Service?

10 năm trước chắc ko ai dùng partern này q:D. Nhiều cách mà. Layer DA là cach hay làm.
Cũng Nhiều người ko thích repo lắm. Nhiều dự án dùng vì đã từng dùng :D
ASKGI47.jpg


Sent using vozFApp
 
Ơ kìa các lập trình viên

Làm Repository pattern mà không nhắc đến Unit of work là vứt đi rồi. :beat_brick:

Còn anh nào bảo swap từ sql sang mongo cũng vứt nốt.

Một cái lợi ích của nó là tách layer ra thể DDD và tiện cho unit test. :go:
 
Back
Top