2010-12-10 33 views
5

Tôi có một câu hỏi về Singletons chạy trong IIS (6,7,7,5) và ASP.NET 4.0 Web Application (ứng dụng MVC3 là cụ thể).Singleton đang chạy trên các ứng dụng web Asp.Net

Tôi có một đối tượng đơn lẻ trong dự án của tôi được truy cập và sử dụng trong global.ascx, trên application_start, cũng như một vài địa điểm khác trong ứng dụng.

Mối quan tâm của tôi là, singleton này cần phải truy cập được ở mỗi trường hợp mẫu. Tuy nhiên, vì IIS về cơ bản là quá trình lưu trữ, là singleton sẽ là cùng một đối tượng trên tất cả các trường hợp của ứng dụng?

Nếu tôi sử dụng từ khóa [ThreadStatic], nó có tách biệt ở cấp ứng dụng Pool Pool không?

Cuối cùng, có cách nào không, tôi có thể đảm bảo một singleton chỉ là một singleton cho mỗi ứng dụng của tôi. tức là nếu tôi chạy ứng dụng của tôi trên 1 trang web, nhưng bên trong 5 thư mục ảo, có 5 phiên bản của singleton hoặc nếu tôi chạy trang web của tôi trên 5 trang web khác nhau trong cùng một hồ bơi ứng dụng.

Hy vọng điều đó đủ rõ ràng, trong trường hợp bạn muốn xem đối tượng đơn lẻ, tôi dán ý tưởng chung về nó bên dưới.

public sealed class Singleton : IDisposable 
{ 
    [ThreadStatic] 
    private static volatile Singleton _instance; 
    [ThreadStatic] 
    private static readonly object _syncRoot = new object(); 

    public bool IsReleased { get; private set; } 

    public Singleton() 
    { 
     IsReleased = false; 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       lock (_syncRoot) 
       { 
        if (_instance == null) 
         _instance = new Singleton(); 
       } 
      } 

      return _instance; 
     } 
    } 

    public void Dispose() 
    { 
     IsReleased = true; 
     Singleton._instance = null; 
    } 
} 
+0

Tôi vẫn còn bối rối. Bạn có biết nó hoạt động như thế nào hay không? Bạn có thể làm cho câu hỏi rõ ràng hơn một chút không? – jcolebrand

+0

Tôi biết làm thế nào một singleton "hoạt động" ở mức cho mỗi quá trình. Câu hỏi đặt ra là làm thế nào IIS sẽ xử lý nó trên nhiều trường hợp của ứng dụng của tôi. – John

+0

Chỉ vì tò mò, tại sao đơn vị của bạn dùng một lần? Bạn có mong đợi có khoảng thời gian mà bạn muốn nó được xử lý, và sau đó hồi sinh lại khi ai đó yêu cầu nó? Các singletons thực sự thường không được xử lý cho đến khi ứng dụng chấm dứt. – StriplingWarrior

Trả lời

0

Với IIS, bạn không kiểm soát được chuỗi yêu cầu của mình. Nếu bạn thực sự cần loại khóa cấp ứng dụng này, bạn có thể muốn xem xét các đối tượng khóa nặng hơn (Mutex, Monitor, vv) và tạo một đối tượng cho mỗi ứng dụng.

3

Giá trị tĩnh phải tĩnh trên một trường hợp cụ thể của ứng dụng web của bạn, vì vậy mỗi phiên bản ứng dụng của bạn sẽ có cá thể riêng của nó sẽ được chia sẻ trên tất cả các chuỗi trên cá thể đó.

Để đọc thêm, xem http://msdn.microsoft.com/en-us/library/2bh4z9hs(v=vs.71).aspx

Oh, và ThreadStatic attribute sẽ gây ra những giá trị tĩnh để chỉ có tĩnh trên một chủ đề cụ thể, vì vậy mọi yêu cầu sẽ có phiên bản riêng của lĩnh vực đó. Nó không có vẻ như đây là những gì bạn đang đi.

+1

Tôi hiểu rằng nhiều, nó là nhiều hơn hoặc ít hơn như thế nào IIS kiểm soát các trường hợp. Vì ứng dụng của bạn đang chạy dưới sự kiểm soát của IIS, đó chính là quá trình điều khiển (w3wp.exe), do đó, nếu chúng ta có 5 trường hợp đang chạy, chúng ta có một vấn đề với các singletons được phân cách giữa 5 trường hợp đó bởi vì tất cả chúng đều chạy dưới w3wp.exe . – John

+0

@John: Từ bài viết được tham chiếu, "Bạn có thể chạy nhiều miền ứng dụng trong một quá trình đơn lẻ với cùng một mức độ cô lập sẽ tồn tại trong các quy trình riêng biệt." Vì vậy IIS có một tiến trình đơn, nhưng nó chạy mỗi cá thể ứng dụng trong miền ứng dụng riêng của nó, vì vậy những thứ như nạp lớp sẽ được xử lý như thể mỗi ứng dụng là một ứng dụng độc lập, hoàn toàn tách biệt khỏi các ứng dụng khác. – StriplingWarrior

+1

Vì vậy, bạn chắc chắn rằng IIS sẽ chạy 5 thư mục ảo khác nhau trong một miền ứng dụng riêng biệt, ngay cả với cùng một hồ bơi ứng dụng? – John

0

Nếu bạn hoàn toàn muốn đảm bảo rằng chúng tách biệt, bạn có thể chạy từng ứng dụng trong Hồ bơi ứng dụng riêng của nó. Bằng cách đó bạn sẽ nhận được một WP cho mỗi thư mục ảo.

+2

Tại sao -1? Điều này không hoạt động? Nếu không, tôi muốn biết để tham khảo trong tương lai của riêng tôi. – Greg

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