2017-01-29 22 views
7

Trong ASP.NET Core/EntityFramework Core, phương thức services.AddDbContext <> sẽ thêm ngữ cảnh được chỉ định làm dịch vụ phạm vi. Đó là sự hiểu biết của tôi rằng đó là quản lý suốt đời được đề xuất cho dbcontext của Microsoft.Định cấu hình Dbcontext là Transient

Tuy nhiên, có nhiều tranh luận trong bộ phận kỹ sư của chúng tôi về điều này và nhiều người cảm thấy rằng bối cảnh cần phải được xử lý ASAP. Vậy, cách tốt nhất để cấu hình dbcontext là Transient mà vẫn duy trì cùng một mẫu Repository thường được sử dụng (tức là tiêm trực tiếp ngữ cảnh vào constructor của kho lưu trữ) cũng như hỗ trợ kiểm thử đơn vị linh hoạt?

+0

Vâng, một bất lợi của DbContext tạm thời là bạn mất chức năng Đơn vị công việc, trừ khi bạn tự thực hiện nó. Theo mặc định, DbContext là thoáng qua và do đó hợp lệ trong suốt thời gian yêu cầu và tất cả các dịch vụ (không chỉ bộ điều khiển) sẽ nhận được cùng một phiên bản của nó. Nếu xảy ra sự cố, bạn chỉ có thể cuộn lại/không phát hành lệnh SaveChanges. Với tạm thời bạn mất điều đó, mỗi dịch vụ sẽ có trường hợp riêng của DbContext. – Tseng

+0

Ngoài ra tôi không nghĩ rằng có nhiều giá trị cho nó, kể từ khi bạn tiêm DbContext thông qua constructor và bạn sẽ phải đảm bảo trong các dịch vụ của bạn không gọi nó sau khi vứt bỏ. Nếu bạn thực sự cần DbContext trong một thời gian rất ngắn, sẽ tốt hơn nếu bạn tạo một nhà máy giống như wrapper để trả lại cho bạn nhà máy tạm thời và để mặc định DbContext đến phạm vi – Tseng

+0

Kỹ thuật tôi đang quan sát là nhà phát triển đang tiêm dboptions vào bộ điều khiển và truyền điều này cho các dịch vụ khác nhau. Các dịch vụ tương ứng sau đó instantiates một bối cảnh mới từ bên trong dịch vụ (với các tùy chọn được cung cấp) và vượt qua xung quanh để các phương pháp khác nhau trong dịch vụ. Theo quan điểm của tôi, điều này không khác gì so với việc tạo ra dbcontext thoáng qua, nhưng có lẽ tôi thiếu những sắc thái có lợi của kiểu triển khai này. –

Trả lời

9

Vòng đời là thông số trên AddDbContext<>(). Xem ví dụ:

services.AddDbContext<ApplicationDbContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")), 
     ServiceLifetime.Transient); 

Điều này sẽ thêm nó vào bộ sưu tập dịch vụ với tuổi thọ trung bình.

+0

Điều này có hiệu quả nếu bộ điều khiển/dịch vụ sử dụng tuổi thọ Scoped? Làm thế nào bạn sẽ yêu cầu DbContext này khi Microsoft.Extensions.DependencyInjection chỉ hoạt động với việc xây dựng tiêm? Hay tôi đang thiếu một cái gì đó? –

Các vấn đề liên quan