Mình đang đọc về unit of work pattern kết hợp với repository pattern.
Unit of work mục đích để các controller khi thực hiện thêm xóa sửa database thì dbContext sẽ dùng chung với nhau thay vì 1 controller tạo 1 DbContext.
Các bạn cho mình hỏi, nếu sử dụng dependency injection (DI) và set lifetime cho DbContext là scoped (1 request tạo 1 cái) thì có đúng khi nói unit of work không còn có ích nữa?
Unit of work có thực sự cần thiết?
Mình cũng mới đọc C# (do dnh có nhiều người pro-C# quá nên thử xem sao) được vài ngày nên mặc dù nguyên lý của UoW+RP là tương đương như trên các ngôn ngữ khác, implementation của UoW+RP trên Entity Framework có thể sẽ không hoàn toàn như cách mình hiểu và viết dưới đây.
Như cách bạn nói:
Unit of work mục đích để các controller khi thực hiện thêm xóa sửa database thì dbContext sẽ dùng chung với nhau thay vì 1 controller tạo 1 DbContext.
Thì nó chỉ là 1 phần của UoW, mục đích chính của UoW là tạo ra 1 abstraction layer giữa logic domain và persistance medium (cái này đúng hơn là từ Repository Pattern) + keep track of the object changes (có thể hiểu là mọi biến đổi của object - nằm trong logic domain - đều phải được ghi nhận) để sau này sẽ reflect lên persistance medium.
Theo như ví dụ trên msdn thì dbcontext chỉ là 1 thành phần trong UoW (mặc dù có nhiều cách implementation khác nữa), bạn có thể xem tại: https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application
Trở lại câu hỏi của bạn:
Không hoàn toàn, UoW vẫn rất hữu ích trong các trường hợp sau:
- Business domain của bạn phức tạp.
- Logic domain của bạn phức tạp.
- Parallel execution.
Ngoài ra m không rõ việc bạn sử dụng DI trong trường hợp này sẽ ra sao, theo m hiểu thì nó nằm hoàn toàn ở 1 layer khác.
Để m lấy ví dụ cho 1 trong 3 trường hợp trên.
Course course = unitOfWork.CourseRepository.GetByID(id);
course.name = "That's how UoW works"
// 100 lines of codes
course.slug = "that's-how-uow-works'
unitOfWork.CourseRepository.Update(course);
trong ví dụ trên thì unitOfWork sẽ theo dõi toàn bộ thay đổi của object course, so sánh với repository của nó, và update những thay đổi đó vào persistance medium (ở đây là Entity Framework).
Dĩ nhiên, với những trường hợp đơn giản như ví dụ trên, bạn hoàn toàn có thể chẳng cần sử dụng UoW làm gì cả, bạn thậm chí viết luôn sql và query ngay tại controller, tuy nhiên bạn sẽ không thể decouple được các thành phần, dẫn tới khó viết test, khó bảo trì hay unpredictable code.