2010-02-09 25 views
6

Tôi đang phát triển một ứng dụng blog được chia sẻ bởi các tổ chức phi lợi nhuận. Tôi muốn mỗi tổ chức có thể thay đổi cài đặt blog của riêng mình. Tôi đã lấy một mẫu đơn (từ BlogEngine.net) và sửa đổi nó. (Tôi hiểu rằng nó không còn là một mẫu đơn.) Tôi đã thử nghiệm cách tiếp cận này và dường như nó hoạt động tốt trong một môi trường phát triển. Đây có phải là mô hình hay không? Có vấn đề gì, có thể phát sinh khi điều này được đặt trong môi trường sản xuất không?Mẫu C# singleton đã sửa đổi này có phải là một thực hành tốt không?

public class UserBlogSettings 
    { 
    private UserBlogSettings() 
    { 
     Load(); 
    } 

    public static UserBlogSettings Instance 
    { 
      get 
      { 
       string cacheKey = "UserBlogSettings-" + HttpContext.Current.Session["userOrgName"].ToString(); 
       object cacheItem = HttpRuntime.Cache[cacheKey] as UserBlogSettings; 
       if (cacheItem == null) 
       { 
        cacheItem = new UserBlogSettings(); 
        HttpRuntime.Cache.Insert(cacheKey, cacheItem, null, DateTime.Now.AddMinutes(1), 
              Cache.NoSlidingExpiration); 
       } 
       return (UserBlogSettings) cacheItem; 
      } 
    } 
}  

(Các phần của mã đã được bỏ qua cho ngắn gọn.)

Nhờ sự giúp đỡ, bình luận vv

Trả lời

5

Nếu nó mỗi phiên, lưu trữ nó trong phiên và không có trong Cache.

Ngoài ra, bạn đang upcasting và downcasting không có lý do ở đây:

object cacheItem = HttpRuntime.Cache[cacheKey] as UserBlogSettings; 

này loại bỏ các diễn viên không cần thiết

UserBlogSettings cacheItem = HttpRuntime.Cache[cacheKey] as UserBlogSettings; 
if (cacheItem == null) 
{ 
    cacheItem = new UserBlogSettings(); 
    HttpRuntime.Cache.Insert(cacheKey, cacheItem, null, 
         DateTime.Now.AddMinutes(1), 
         Cache.NoSlidingExpiration); 
} 
return cacheItem; 
+0

Đó là bởi tổ chức sử dụng (như trái ngược với người dùng) - vì vậy tổ chức xyz có thể có nhiều người sử dụng trên trang web cùng một lúc xem blog của mình . –

+1

@geri Điều đó có ý nghĩa hơn. Khác với vấn đề diễn viên của nó không phải là xấu. Bạn chắc chắn bạn chỉ muốn lưu nó trong một phút? Hãy xem xét thời gian tồn tại của đối tượng khi tạo/chèn nó vào bộ nhớ cache. – Will

+0

Cảm ơn đề xuất truyền - bộ nhớ cache một phút chỉ dành cho phát triển. Điều gì về trường hợp tĩnh? Có vấn đề gì với điều đó không? –

0

tôi nghĩ là bạn tốt nói chung, nhưng tôi sẽ đề nghị một buổi biểu diễn nâng cao nếu nó trở nên cần thiết (tôi biết ... không tối ưu hóa cho đến khi bạn thực sự cần).

tôi có lẽ sẽ thực hiện điều này với một phương pháp như thế này để có được các thiết lập đối tượng:

public static UserBlogSettings getSettings(string orgName, Cache cache) { 
    // do the same stuff here, except using the method parameters 
} 

Lý do cho điều này là HttpContext.Current và HttpRuntime.Cache phải đi qua một số gyrations để có được xử lý để Phiên hiện tại và Cache. Nếu bạn đang gọi điều này từ một trang asp.net, bạn đã có những thứ đó trong tay. Vì vậy, sử dụng những cái bạn đã có thay vì tìm kiếm chúng một lần nữa.

3

Bạn cần phải sử dụng khóa để tránh điều kiện chủng tộc có thể:

private static Object lock_Instance = new Object(); 
    public static UserBlogSettings Instance 
    { 
     get 
     { 
      string cacheKey = "UserBlogSettings-" + HttpContext.Current.Session["userOrgName"].ToString(); 
      UserBlogSettings cacheItem = HttpRuntime.Cache[cacheKey] as UserBlogSettings; 
      if (cacheItem == null) 
      { 
       lock (lock_Instance) 
       { 
        // need to check again in case another thread got in here too 
        cacheItem = HttpRuntime.Cache[cacheKey] as UserBlogSettings; 
        if (cacheItem == null) 
        { 
         cacheItem = new UserBlogSettings(); 
         HttpRuntime.Cache.Insert(cacheKey, cacheItem, null, 
          DateTime.Now.AddMinutes(1), Cache.NoSlidingExpiration); 
        } 
       } 
      } 
      return cacheItem; 
     } 
    } 
Các vấn đề liên quan