2011-01-31 28 views
5

Thành thật mà nói tôi là một người mới trong cả C# và Asp.net MVC. Tôi cũng không biết làm thế nào các ứng dụng web asp.net thực sự hoạt động trên IIS và ASP.NET framework đằng sau hiện trường.Trường tĩnh của DbContext trong Global.asax so với trường mẫu của DbContext trong lớp điều khiển?

Tôi nhầm lẫn với quyết định nơi tôi phải khai báo một trường DbContext (hoặc bất kỳ lớp nào có nguồn gốc từ DbContext) trong ứng dụng asp.net mvc của tôi.

Tôi có hai lựa chọn:

  1. Khai sân khi một lĩnh vực tĩnh bên global.asax sao cho tất cả các bộ điều khiển có thể tận dụng nó.
  2. Khai báo trường dưới dạng trường thể hiện bên trong mỗi lớp bộ điều khiển.

Bạn có thể giải thích cái nào đúng không? Giải thích chi tiết hơn là thực sự cần thiết.

Trả lời

8

Nếu bạn đặt trường tĩnh trong global.asax, bạn sẽ gặp sự cố đồng thời. Nhiều luồng từ nhiều yêu cầu có thể đến và lấy dữ liệu của nhau. Điều tệ hơn là điều này sẽ không hiển thị cho đến khi bạn bắt đầu nhận được nhiều lưu lượng truy cập hơn trên trang web của mình hoặc cho đến khi bạn bắt đầu thử nghiệm tải. Bạn sẽ thực hiện nó như là một singleton, tất cả sẽ được làm việc tốt trong thử nghiệm của bạn, và bạn sẽ nghĩ, "Tôi là một thiên tài! Nhìn cách làm sạch này thực hiện!" Nhưng một ngày nào đó, bạn sẽ bị đốt cháy bởi điều này, như tôi đã từng. Kết quả sẽ bị lẫn lộn, người dùng sẽ bắt đầu thấy dữ liệu không thuộc về họ và trang web sẽ hoạt động bất ngờ.

Các lớp ngữ cảnh cho cả Khuôn khổ thực thể và LINQ to SQL được thiết kế để là bản trình bày nhẹ, thứ bạn thiết lập cho mỗi bộ truy vấn bạn muốn chạy. Nó không có nghĩa là sống lâu.

Check out this other Stack Overflow question/answer on the same topic, worded differently.

4

Bạn nên sử dụng tùy chọn thứ hai. tức là khai báo và sử dụng nó trong bộ điều khiển. Nếu bạn đặt DBContext như một trường tĩnh trong global.asax, về cơ bản bạn làm cho nó trở thành một cá thể đơn lẻ cho toàn bộ ứng dụng.

Mặt khác, với tùy chọn thứ hai bạn có DBcontext cho mỗi yêu cầu. Nó sẽ là tốt hơn nếu bạn có thể sử dụng một tiêm phụ thuộc để có được DBContext trong mỗi phương thức hành động.

+0

nhược điểm là những gì nếu tôi làm cho việc sử dụng một trường hợp duy nhất của DbContext (hoặc lớp có nguồn gốc từ DbContext) cho toàn bộ ứng dụng? – LaTeX

+2

@Stack Overflow - đọc lên trên "singletons" về kết nối cơ sở dữ liệu và tại sao nó lại là điều ác. – RPM1984

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