2010-02-01 24 views
8

Trong một ứng dụng web, tôi cần chỉ có một cá thể của một lớp có tên là ProcessManager. Một cách là làm cho nó thành một singleton. Cách khác là sử dụng HttpApplicationState để đảm bảo tôi luôn truy cập cùng một trường hợp như sau:Singleton và HttpApplicationState

Phương pháp nào tốt hơn và tại sao?

Trả lời

7

Dựa trên mô tả hạn chế bạn đã đưa ra, tôi sẽ chọn Singleton, vì sau đó nó không có phụ thuộc vào HttpContext.Current và có thể được sử dụng bên ngoài đường dẫn ASP.Net (ví dụ: khi bạn muốn viết các bài kiểm tra đơn vị.)

(Ngoài ra, khi bạn đặt thứ gì đó vào ApplicationState, trước tiên bạn cũng cần gọi Lock() trên đó, và sau đó mở khóa() sau khi bạn đã viết xong, chắc chắn rằng đó là chủ đề an toàn.)

Cách khác, cho phép tiêm một HttpContext khi bạn tạo ProcessManager của bạn, để bạn có thể sử dụng nó với một HttpContext giả.

1

(tôi giả sử constructor ProcessManager của bạn là tư nhân.)

Làm cho nó một singleton thực tế sẽ là tốt nhất, bởi vì một cách tiếp cận như vậy sẽ làm cho nó cấu trúc không thể đối với các lập trình viên khác được duy trì mã của bạn để vô tình tạo nhiều trường hợp. Không có gì ngăn chặn một người tiêu dùng truy cập trực tiếp vào HttpApplicationState và loại bỏ và thay thế cá thể ProcessManager. Vì vậy, bạn phải dựa vào quy ước để bảo vệ cá thể của ProcessManager trong HttpApplicationState.

Chỉ khi có trường hợp sử dụng thực tế cho nhiều phiên bản của lớp tồn tại, có nghĩa là cho phép nhiều instantiations trong khi dựa vào quy ước để bảo vệ cá thể trong HttpApplicationState.

1

nếu bạn có kế hoạch để thực hiện nó như singleton, as per Jon Skeet (còn được gọi C# guru), ông đích thân thích vào mã bên dưới

public sealed class Singleton 
{ 
    static readonly Singleton instance=new Singleton(); 

    // Explicit static constructor to tell C# compiler 
    // not to mark type as beforefieldinit 
    static Singleton() 
    { 
    } 

    Singleton() 
    { 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
}