MvcApplication! = singleton
có nghĩa là tất cả các câu trả lời ở trên đều thiếu điểm và sẽ khiến bạn gặp rắc rối nghiêm trọng nếu bạn tin tưởng sai khi truy cập cùng một trường hợp trong khi trong thực tế sẽ có một số.
Giả định đầu tiên của bạn không hợp lệ: Trái ngược với (rất - chỉ xem các câu trả lời khác ở đây là bằng chứng) niềm tin rộng rãi, MvcApplication KHÔNG phải là một singleton toàn cầu. Lớp được khởi tạo nhiều lần, một ví dụ cho mỗi "đường ống", vì vậy bộ đếm hiệu suất "số lượng đường ống dẫn" cho bạn biết có bao nhiêu phiên bản của MvcApplication hiện đang bị coi là còn sống. Thêm một ctor mặc định và tự chứng minh điều này:
public MvcApplication()
{
Trace.WriteLine(this.GetHashCode());
}
Gỡ lỗi ngắt dòng hoặc xem các mã băm khác nhau trong DebugViewer. Để bắt buộc đếm số lượng đường dẫn tạo ra một phương thức với Thread.Sleep (5000), Asp.Net sau đó sẽ kích hoạt một cá thể mới khi bạn thực hiện một yêu cầu http khác song song.
Solution - Làm thế nào để nhanh chóng độc thân trong các ứng dụng Asp.Net (MVC hoặc WebForms)
Nếu lớp MvcApplication của bạn tuy nhiên có một phương pháp Application_Start() sau đó phương pháp này được gọi là trên thực tế chỉ một lần, quá trình rộng. Bạn có thể đặt các trường tĩnh ở đó. Đơn giản chỉ cần đặt chúng vào bất kỳ lớp nào, thường là MvcApplication là một lựa chọn thông thường tốt và truy cập chúng. Giống như
MvcApplication.MySingleValue = 72;
MvcApplication.ActivePlayersCount = 3400;
var n = MvcApplication.ActivePlayersCount;
...
HttpApplication weirdness
Thiết kế của lớp HttpApplication và các sự kiện của nó là khá kỳ lạ, mà có lẽ có lý do của nó trong một số loại lỏng lẻo của các khả năng tương thích ngược thiết kế để rất cũ COM dựa trang ASP. Có đối tượng ứng dụng thực tế chỉ được tạo ra một lần, chắc chắn là nguồn gốc của niềm tin sai liên quan đến Asp.Net.Ví dụ về sự kỳ lạ của HttpApplication:
protected void Application_Start()
{
}
Lưu ý rằng không có sự ghi đè nào liên quan! Tóm lại, các trường hợp ứng dụng có thể ít quan tâm đến hầu hết thời gian, tôi không thể thấy kịch bản nào có thể liên quan đến trạng thái giữ, vì trạng thái của nó sẽ được chia sẻ bởi một tập con tùy ý được xử lý. Vì vậy, truy cập nó theo cách hoàn toàn tốt như đã đề cập bởi Matt có thể không được yêu cầu quá thường xuyên.
Bạn có thể giải thích điều bạn đang cố đạt được với điều này không? Có thể có một cách khác, thậm chí tốt hơn, để hoàn thành nhiệm vụ. – griegs
những gì tôi muốn là: với ứng dụng mvc của tôi, tôi muốn nhận được giá trị chuỗi truy vấn khi người dùng truy cập vào trang chủ như: http: // localhost: 2929 /? Source = abc. thì tôi muốn đặt nguồn này = abc trong MvcApplication. lớp công khai MvcỨng dụng: System.Web.HttpApplication { Nguồn chuỗi công khai; // ..... } Sau đó, tôi muốn để nguồn có sẵn cho tất cả các quan điểm: Tôi muốn tiếp cận nguồn trong constructor điều khiển như: MvcApplication ứng dụng = HttpContext.Current.Application như MvcApplication chuỗi Src = app.Source ; ... – KentZhou
Cảnh báo: Trước khi rời khỏi chủ đề này với câu trả lời được đánh dấu, hãy đọc câu trả lời của tôi bên dưới, vì các anwers khác, bao gồm cả dấu được đánh dấu, tất cả đều dựa trên giả định hoàn toàn sai rằng MvcApplication là một singleton toàn cầu. – citykid