Tôi sử dụng bộ điều khiển cơ sở để lộ thuộc DataBase
tính mà bộ điều khiển dẫn xuất có thể truy cập.
public abstract class BaseController : Controller
{
public BaseController()
{
Database = new DatabaseContext();
}
protected DatabaseContext Database { get; set; }
protected override void Dispose(bool disposing)
{
Database.Dispose();
base.Dispose(disposing);
}
}
Tất cả các bộ điều khiển trong ứng dụng của tôi bắt nguồn từ BaseController
và được sử dụng như sau:
public class UserController : BaseController
{
[HttpGet]
public ActionResult Index()
{
return View(Database.Users.OrderBy(p => p.Name).ToList());
}
}
Bây giờ để trả lời câu hỏi của bạn:
Khi nào tôi nên tạo một DbContext mới / tôi nên có một ngữ cảnh toàn cục mà tôi chuyển qua?
Ngữ cảnh phải được tạo theo yêu cầu. Tạo bối cảnh, làm những gì bạn cần làm với nó sau đó loại bỏ nó. Với giải pháp lớp cơ sở mà tôi sử dụng, bạn chỉ phải lo lắng về việc sử dụng ngữ cảnh.
Không thử và có bối cảnh chung (đây không phải là cách các ứng dụng web hoạt động).
Tôi có thể có một Ngữ cảnh toàn cầu mà tôi sử dụng lại ở mọi nơi không?
Không, nếu bạn giữ một bối cảnh xung quanh nó sẽ theo dõi tất cả các cập nhật, bổ sung, xóa, v.v. và điều này sẽ làm chậm ứng dụng của bạn và thậm chí có thể gây ra một số lỗi khá nhỏ xuất hiện trong ứng dụng của bạn.
Bạn có thể nên chọn hiển thị kho lưu trữ của mình hoặc Bối cảnh của bạn cho bộ điều khiển của bạn nhưng không phải cả hai. Việc có hai ngữ cảnh được truy cập từ cùng một phương pháp sẽ dẫn đến lỗi nếu cả hai đều có ý tưởng khác nhau về trạng thái hiện tại của ứng dụng.
Cá nhân, tôi thích hiển thị DbContext
trực tiếp vì hầu hết các ví dụ về kho lưu trữ mà tôi đã thấy chỉ đơn giản là kết thúc như những lớp bọc mỏng xung quanh DbContext
.
Điều này có gây ra hiệu suất ăn khách không?
Lần đầu tiên a DbContext
được tạo khá tốn kém nhưng khi điều này đã được thực hiện, rất nhiều thông tin sẽ được lưu vào bộ nhớ đệm để các lần khởi tạo tiếp theo nhanh hơn rất nhiều. bạn có nhiều khả năng gặp các vấn đề về hiệu suất do giữ một ngữ cảnh xung quanh hơn là do bạn khởi tạo một ngữ cảnh mỗi khi bạn cần truy cập vào cơ sở dữ liệu của mình.
Làm thế nào những người khác đang làm điều này?
Nó phụ thuộc.
Một số người thích sử dụng khung phụ thuộc để chuyển một phiên bản cụ thể của ngữ cảnh đến bộ điều khiển của họ khi nó được tạo. Cả hai lựa chọn đều ổn. Của tôi phù hợp hơn cho một ứng dụng quy mô nhỏ mà bạn biết rằng cơ sở dữ liệu cụ thể đang được sử dụng sẽ không thay đổi.
một số người có thể tranh luận rằng bạn không thể biết điều này và đó là lý do tại sao phương pháp tiêm phụ thuộc tốt hơn vì nó làm cho ứng dụng của bạn thay đổi linh hoạt hơn. Ý kiến của tôi về điều này là nó có thể sẽ không thay đổi (SQL server & Entity Framework hầu như không bị che khuất) và tốt nhất tôi nên dành thời gian để viết mã dành riêng cho ứng dụng của mình.