2017-11-03 114 views
1

我有一個asp.net基於MVC的網站,包括三個層次:添加緩存,在數據層MVC項目(類庫)

  1. 表示層(MVC網站)
  2. 領域層(類庫)
  3. 數據層(類庫)

和這裏是我的代碼

PR esentation層:

public ActionResult MyAction(int categoryId = 1) 
    { 
     var products = service.GetProductsByCategory(categoryId); 
     return View(products); 
    } 

領域層:

public List<MyProduct> GetProductsByCategory(int categoryId) 
    { 
     /* some code here */ 
     return myProductDao.GetProductsByCategory(categoryId); 
    } 

數據層:

public List<MyProduct> GetProductsByCategory(int categoryId) 
    { 
     /* check if data available in cache to avoid pulling database */ 
     using (var context = new myDbEntities()) 
     { 
      var myproducts = context.ProductEntities.Where(p => p.CategoryId == categoryId); 
      return Mapper.Map<List<ProductEntity>, List<Product>>(products); 
     } 
    } 

我們每天假設產品表的改變只有一次,我想添加緩存層以避免在特定時間拉取數據庫。

問題: 我通常使用HttpContext.Cache.Insert()的控制器高速緩存,但現在我打算緩存添加到數據層,它是一個類庫,沒有HttpContext的。通常在數據層中緩存如何完成

+0

如果需要,您可以在數據層中添加對具有HttpContext的程序集的引用。但恕我直言,我個人不會將緩存添加到數據層。我會保持數據層,因此它總是從數據庫中提取數據。我將保持控制器和數據訪問層之間的緩存層(可能是業務層) – Shyju

+0

@Shyju劑量添加一個對具有HttpContext的程序集的引用,正確的方法是做什麼? –

+0

呵呵,人不要添加引用,只需創建一個接口並將其作爲依賴關係傳遞給它。發佈答案。 –

回答

2

有很多方法可以解決這個問題。我會做的是抽象如何緩存與接口,然後注入,但是你想緩存到數據層(包括使用HttpContext.Cache.Insert)。

MyProject.Cache

public ICache 
{ 
    void Insert (string key, object value) 
} 

MyProject.Web

internal WebCache : ICache 
{ 
    public void Insert(string key, object value) 
    { 
    HttpContext.Cache.Insert(key, value); 
    } 
} 

public Controller 
{ 
    private service = new service(new WebCache); 
} 

MyProject.Domain

public Service 
{ 
    private readonly ICache _cache; 
    private readonly MyProductDao _myProductDao; 
    public Service(ICache cache;) 
    { 
    _cache = cache; 
    _myProductDao = new MyProductDao(_cache); 
    } 

    public List<MyProduct> GetProductsByCategory(int categoryId) 
    { 
     /* some code here */ 
     return _myProductDao.GetProductsByCategory(categoryId); 
    } 
} 

MyProject.Data(如果你只是想在數據層高速緩存)

public MyProductDao 
{ 
    private readonly ICache _cache; 
    public MyProductDao(ICache cache) 
    { 
    _cache = cache; 
    } 

    public List<MyProduct> GetProductsByCategory(int categoryId) 
    { 
    /* check if data available in cache to avoid pulling database */ 
    _cache.DoWhatever().... 

    using (var context = new myDbEntities()) 
    { 
     var myproducts = context.ProductEntities.Where(p => p.CategoryId == categoryId); 
     return Mapper.Map<List<ProductEntity>, List<Product>>(products); 
    } 
    } 

根據需要擴展ICache並在您的internal WebCache上實現它。

0

如何通常數據層

做高速緩存,我不認爲它應該數據層來完成。

向數據層添加緩存對我來說似乎違反了單一責任原則。您的數據層應該只負責一件事 - 從持久存儲庫(即數據庫)獲取數據。

在代碼中的某個地方,你需要做這個工作流程(或者它的一些變體):

  1. 檢查
  2. 如果發現緩存中的項目十,獲得該項目從緩存中。
  3. 如果找不到,從持久存儲中獲取該項目。
  4. 退貨此商品。

在我看來,一個獨立於數據層的組件應該完成這個工作流程。

這樣看待:一旦將緩存置於數據庫持久層之前,您就不再只是從數據庫獲取數據。您從這個新組件獲取數據,並且組件決定從哪裏獲取記錄(緩存與數據庫)。