2009-06-08 35 views
11

Chúng tôi đang phát triển ứng dụng .NET 3.5 Windows Forms, sử dụng LINQ to SQL và MVP. Chúng tôi có một lớp DataRepository để lấy dữ liệu:Sử dụng biến tĩnh cho dữ liệu bộ nhớ cache

public class DbUserRepository : IUserRepository 
{ 
    private IList<UserName> _users; 

    public IList<UserName> GetUserNames() 
    { 
    if (_users == null) 
    { 
     // retrieve _users from DB 
    } 

    return _users; 
    } 

Để cache danh sách người dùng trên tất cả các trường hợp của DBUserRepository, chúng ta sẽ sử dụng Caching Application Block Thư viện của Doanh nghiệp.

Nhưng nó xảy ra với tôi, tôi không thể chỉ khiến người dùng trở thành thành viên tĩnh? Đối với một số lý do mà có vẻ như một "trường học cũ" cách, nhưng nó hoạt động. Có bất kỳ nhược điểm nào để thực hiện việc này không? Đây có phải là thiết kế tồi không?

private static IList<UserName> _users; 

Cảm ơn

Trả lời

10

Điều quan trọng nhất để thực hiện điều này là chính xác do những gì static có nghĩa là; mặc dù bạn có thể có nhiều đối tượng DbUserRepository, chúng sẽ luôn chỉ chia sẻ một biến số _users. Trường hợp này gây ra vấn đề:

  • Nếu ứng dụng của bạn bao giờ trở nên đa luồng, và bạn muốn mỗi thread có kho lưu trữ sử dụng riêng biệt của nó (đã hoặc chưa đây là một mối quan tâm phụ thuộc vào những gì các kho lưu trữ có nghĩa là trong bối cảnh hệ thống của bạn)

  • đơn vị kiểm tra lớp DbUserRepository trở nên phức tạp hơn, bởi vì nếu bạn chạy nhiều kiểm tra đơn vị trên lớp này, họ sẽ tiếp tục trạng thái cùng với họ từ thử nghiệm để kiểm tra, có nghĩa là chạy thử trở nên trật tự phụ thuộc ... là khá không mong muốn

3

cho bộ nhớ đệm đơn giản tôi nghĩ biến tĩnh là tốt, chỉ cần có một chút cẩn thận về việc sử dụng ổ khóa để bảo vệ nhiều đề truy cập vào biến _users. Tuy nhiên, một cách tiếp cận tốt hơn có thể là sử dụng lớp ASP.NET Cache. Tôi biết nó nằm trong không gian tên System.Web nhưng bạn có thể use it outside of ASP.NET application too.

3

Vài điều cần xem xét.

  1. Chủ đề An toàn khi khởi tạo biến
  2. AppDomains. Các biến tĩnh là cục bộ cho một cá thể AppDomain. Vì vậy, nếu bạn có nhiều AppDomain đang chạy, bạn sẽ có nhiều phiên bản của bộ nhớ cache

Đây có thể là hoặc không quan tâm đến ứng dụng của bạn. Có thể không, nhưng đáng chú ý.

0

Nếu bạn cần nhiều hơn một trong số chúng, bạn sẽ phải nỗ lực hết sức để loại bỏ mã tĩnh khỏi mã của bạn và bắt đầu truyền đi khắp nơi.

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