Anh ếch xanh chê là microsoft viết cái repository pattern sai rồi
https://docs.microsoft.com/en-us/as...f-work-patterns-in-an-asp-net-mvc-application
Nhưng theo tôi thì nó viết không sai, mà nó viết chung chung quá. Repository Pattern của Microsoft viết thì dữ liệu nó đã được chuyển qua IEnumerable (In-memory) mà không phải IQueryable (build sql). Tức là về tính chất thì nó không sai nhưng nó viết 1 case quá cơ bản nên nhiều người nhiều sai.
Trên Google có thể tìm được rất nhiều bài viết về GenericRepository mà mỗi function sẽ trả ra IQueryable (cái này thì cơ bản là sai về định nghĩa của Repository Pattern) và cái này là thừa (tôi đồng ý với quan điểm thừa anh ếch xanh)
Cái này khá đơn giản.
Scoped = mỗi thread thì 1 class sẽ chỉ sinh ra 1 object tương ứng, do đó việc inject giữa nhiều service khác nhau thực chất vẫn là 1 object, do đó có thể thực hiện transaction của UOW được.
Transient = mỗi class sẽ tự tạo 1 object tương ứng với lần inject đó => không thực hiện được UOW transaction vì DataContext nó khác nhau.
Singleton = tạo 1 object xuyên suốt life time của ứng dụng => xung đột dữ liệu của DataContext khi có nhiều thread thực hiện vì EF yêu cầu thread safe.
=> Do đó cách dùng đúng của UOW là phải dùng Scoped thôi.
Về Database connection pool thì mặc định từ bản 3.1 trở xuống thì với connection string không chỉ định connection pool thì set là 100 connection. Còn với bản EF 5 trở lên thì đã bỏ giới hạn này đi. Do đó với các ứng dụng nhiều luồng truy cập thì phải nâng maximum connection pool lên 1000 hoặc hơn, tùy vào stress testing thôi. Còn cái chuyện connection pool tức là nó dùng connection xong thì nó trả về pool cho thread khác sử dụng thôi.