2010-01-25 38 views
31

Chỉ muốn đảm bảo rằng tôi không giả định điều gì đó ngu ngốc ở đây, khi triển khai mẫu đơn trong một ứng dụng web ASP .Net, phạm vi biến tĩnh chỉ dành cho phiên người dùng hiện tại, phải không? Nếu người dùng thứ hai đang truy cập trang web thì đó là phạm vi bộ nhớ khác ...?ASP .NET Singleton

+6

Câu trả lời ngắn gọn là không, bạn đã sai. –

+1

Trùng lặp: http://stackoverflow.com/questions/194999/are-static-class-instances-unique-to-a-request-or-a-server-in-asp-net –

Trả lời

28

Phạm vi biến tĩnh là dành cho toàn bộ miền ứng dụng, có nghĩa là các phiên khác cũng có quyền truy cập vào nó. Chỉ khi bạn có một trang trại với các máy chủ khác nhau, bạn sẽ có nhiều hơn một thể hiện của biến.

+3

+1 "Chỉ khi bạn có một trang trại với các máy chủ khác nhau, bạn sẽ có nhiều hơn một biến của biến ". –

4

Nếu bạn cần nó là người dùng hoặc phiên làm việc, hãy kiểm tra liên kết sau. Nếu không, như Otavio đã nói, singleton có sẵn cho toàn bộ miền.

http://samcogan.com/singleton-per-asp-net-session/

+0

Liên kết của bạn dường như đã chết –

+2

@Michael Lang: Vâng, có vẻ như sam đã thay đổi công cụ nội dung của anh ấy. Đã cập nhật liên kết với tham chiếu mới. – NotMe

0

Các singleton được sử dụng cho toàn bộ ứng dụng Domain, nếu bạn muốn để lưu trữ dữ liệu người dùng phiên liên quan đến sử dụng HttpContext phiên được thiết kế cho mục đích đó. Tất nhiên, bạn có thể phải thiết kế lại cấu trúc lớp của bạn để có thể tìm ra cách xử lý khóa-giá trị-cặp với dữ liệu bạn đang cố gắng làm việc.

15

Như những người khác đã đề cập, một biến tĩnh là global to the entire application, not single requests.

Để thực hiện một singleton toàn cầu để yêu cầu chỉ riêng lẻ, bạn có thể sử dụng từ điển HttpContext.Current.Items.

public class Singleton 
{ 
    private Singleton() { } 

    public static Singleton Instance 
    { 
     get 
     { 
      if (HttpContext.Current.Items["yourKey"] == null) 
       HttpContext.Current.Items["yourKey"] = new Singleton(); 
      return (Singleton)HttpContext.Current.Items["yourKey"]; 
     } 
    } 
} 
+0

Xin cảm ơn, Chi phí cho việc này là gì? nó sẽ chậm hơn nhiều nếu tôi truy cập vào singleton khá thường xuyên? – Wesly

+0

@Ws Bạn không nên nhận thấy bất kỳ vấn đề hiệu suất nào với phương pháp này. Việc triển khai từ điển khá hiệu quả vì vậy nó sẽ không làm chậm ứng dụng của bạn ngay cả khi bạn truy cập nó rất nhiều. –

+0

tại sao chúng ta nên sử dụng "HttpContext.Current.Items" thay vì "Phiên"? – Seva

32

Thành viên tĩnh chỉ có phạm vi quy trình công nhân hiện tại, vì vậy các yêu cầu khác không nhất thiết phải được xử lý bởi cùng một quy trình công nhân.

  • Để chia sẻ dữ liệu với người dùng cụ thể và theo yêu cầu, hãy sử dụng HttpContext.Current.Session.
  • Để chia sẻ dữ liệu trong một yêu cầu cụ thể, hãy sử dụng HttpContext.Current.Items.
  • Để chia sẻ dữ liệu trên toàn bộ ứng dụng, hãy viết một cơ chế cho điều đó hoặc cấu hình IIS để làm việc với một quy trình đơn và viết một ứng dụng đơn/sử dụng.

Nhân tiện, số lượng quy trình công nhân mặc định là 1, vì vậy đây là lý do mọi người nghĩ rằng các thành viên tĩnh có phạm vi toàn bộ ứng dụng.

-2

Phiên cho toàn bộ ứng dụng cho mỗi người dùng. ViewState cho trang asp đơn lẻ.

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