2 cách đều Generic Repository:
Cách 1: đưa hết các Repositories, DbContext vào một class UnitOfWork để quản lý
https://github.com/dotnetvn-projects/GenericReposAndUnitOfWork/tree/master/Demo
Cách 2: Inject UnitOfWork vào mỗi Repository
(thư mục/project MVCTutorial.Repository)
https://github.com/Quangsumi/Repo_UoW/tree/master/MVCTutorial
Xin cao kiến của các thým

Không hiểu tại sao lại làm Generic Repository luôn. Tự thấy cái việc này nó là tối kiến chứ không phải sáng kiến để clean code
Không hiểu tại sao lại làm Generic Repository luôn. Tự thấy cái việc này nó là tối kiến chứ không phải sáng kiến để clean code
Thým giải thích thêm được không? giữa Clean code và Reusable code thì chọn clean code???
Theo đúng lý thuyết thì theo cách 1 thím ạ.
Cách 2 kiểu như đồ chế theo tình huống, việc sử dụng repository trong business không cần quan tâm đến context/transaction. Cái service/business layer cũng có thể ném lên cách 1 để có thin controller.
Ngoài ra thì có thể có benefit gì đó với unittest mà em chưa rõ
Reactions:
giosongonline
Theo đúng lý thuyết thì theo cách 1 thím ạ.
Cách 2 kiểu như đồ chế theo tình huống, việc sử dụng repository trong business không cần quan tâm đến context/transaction. Cái service/business layer cũng có thể ném lên cách 1 để có thin controller.
Ngoài ra thì có thể có benefit gì đó với unittest mà em chưa rõ
Nếu "không cần quan tâm đến context/transaction" thì còn sử dụng UnitOfWork làm gì nhỉ? Em để ý cách 2 chỗ nào có
IUnitOfWork _unitOfWork đều có thể thay bằng
MVCTutorialEntitiesContainer _dbContext, không thấy ý nghĩa gì cả.
Vậy là chọn cách 1 ạ

Đang chưa hiểu mấy bác nói gì, hoá ra là C#, lần sau bác có thể thêm tag C# vào tựa đề được không?

Reactions:
giosongonline
Mình không hiện thực theo cách nào trong 2 cách trên. Tuy nhiên, nếu phải chọn thì nên chọn cách 1.
Cách 1 (xuất phát từ bài
này) sẽ có hai nhược điểm:
- Nếu thêm repository thì phải sửa class UnitOfWork -> sai Single responsibility
- Khi cần call method của một repository thì phải gọi dạng này unitOfWork.NewsRepository.GetAll -> sai Law of Demeter
Với cách 2, thực tế sẽ không ai đi new Repository ở bên ngoài cả mà sẽ dùng IoC container để quản lý việc tạo repository ở một chỗ và inject repository khi cần. Nhờ vậy khi sử dụng repository, lập trình viên hoàn toàn không biết sự có mặt của UnitOfWork. Tuy nhiên, mục đích sinh ra cái UnitOfWork là cho lúc bạn cần gọi nhiều repository khác nhau, các thao tác đó sẽ được bao trong một transaction duy nhất, cách 2 không giải quyết được vấn đề này trong khi cách 1 thì làm được.
Reactions:
giosongonline
Mình không hiện thực theo cách nào trong 2 cách trên. Tuy nhiên, nếu phải chọn thì nên chọn cách 1.
Cách 1 (xuất phát từ bài
này) sẽ có hai nhược điểm:
- Nếu thêm repository thì phải sửa class UnitOfWork -> sai Single responsibility
- Khi cần call method của một repository thì phải gọi dạng này unitOfWork.NewsRepository.GetAll -> sai Law of Demeter
Với cách 2, thực tế sẽ không ai đi new Repository ở bên ngoài cả mà sẽ dùng IoC container để quản lý việc tạo repository ở một chỗ và inject repository khi cần. Nhờ vậy khi sử dụng repository, lập trình viên hoàn toàn không biết sự có mặt của UnitOfWork. Tuy nhiên, mục đích sinh ra cái UnitOfWork là cho lúc bạn cần gọi nhiều repository khác nhau, các thao tác đó sẽ được bao trong một transaction duy nhất, cách 2 không giải quyết được vấn đề này trong khi cách 1 thì làm được.
Thým có thể mô tả cách của thým được không, nếu có code mẫu hay bài viết hướng dẫn thì càng tốt ạ. Em cảm ơn

Thým giải thích thêm được không? giữa Clean code và Reusable code thì chọn clean code???
Bảo cái generic repository nó ngu là vì nó còn kém hơn cả EF thì tại sao phải dùng nó, EF có đủ các function CRUD và hơn thế nữa.
Nó còn không thể hiện được ngữ nghĩa của repository. Tài liệu của MS nhé:
https://docs.microsoft.com/en-us/do...terns/infrastructure-persistence-layer-design
Cụ thể 1 repository cần quản lý 1 aggregate với chủ thể là aggregate root. Mặt khác có những Entity mà Repository cho nó sẽ không đủ CRUD. Ví dụ như Log thì chỉ có R và C thôi. Generic repository không thể hiện được cả 2 khía cạnh trên.
Reactions:
giosongonline