2015-11-07 104 views
0

我一直在嘗試學習服務層和存儲庫模式是如何工作的。到目前爲止,我已經寫了一個服務層和一個簡單的存儲庫模式接口。但是,我經常看到一些文章指出,存儲庫模式允許在不消耗代碼的情況下更換不同的數據存儲庫。使用存儲庫模式提供對不同數據存儲的訪問

在我的情況下,我希望能夠支持讀取和寫入應用程序數據到CSV和/或XML文件。這是我不明白如何正確使用存儲庫模式實現這一點的部分。我應該每個數據存儲都有一個存儲庫嗎?

ProductCsvRepository : IProductRepository 
ProductXmlRepository : IProductRepository 

但是如果我這樣做,那麼服務層必須知道底層數據存儲,打破了能夠方便地換入或換出不同的數據存儲的想法。

然後我必須有一個看起來像這樣的服務層嗎?

private readonly IProductXmlRepository _productXmlRepository; 
private readonly IProductCsvRepository _productCsvRepository; 

public ProductService() 
{ 
    _productXmlRepository = new IProductXmlRepository(); 
    _productCsvRepository = new IProductCsvRepository(); 
} 

public ICollection<Product> GetAllXml() 
{ 
    return _productXmlRepository.GetAllCsv(); 
} 

public ICollection<Product> GetAll() 
{ 
    return _productCsvRepository.GetAllXml(); 
} 

這就提出了兩個問題:

  • 這無疑打破然後消費代碼需要知道數據存儲是個什麼概念呢?
  • 在使用代碼確實需要了解數據存儲的情況下,如「文件>導出爲」類型功能的情況如何呢?導出功能實際上應該是使用適當的CSV或XML服務的不同服務嗎?

我想我很不明白如何正確實現存儲庫模式和服務層。我應該如何設計存儲庫模板和服務層?

+1

你的服務的構造函數應該接受一個'IProductRepository'。現在你的服務對象將由'ProductCsvRepository'或'ProductXmlRepository'構成。在運行時,您可以發送兩者中的任意一個來執行「IProductRepository」操作。 – singsuyash

回答

2

查看依賴注入和插件模式。他們支持注入一個存儲庫的具體實現。您的服務層然後只有一個參考IProductRepository和一個具體的存儲庫被注入。一些沿線的:

public class ProductService 
{ 
    private readonly IProductRepository _productRepository; 

    public ProductService(IProductRepository productRepository) 
    { 
     _productRepository = productRepository; 
    } 
} 


public class ConsumingClass { 
{ 
    private readonly IProductService _productService = new ProductService(new ProductXmlRepository()); 

    // methods to use the the product service 
} 

但更好的是使用像NInject或SimpleInjector控制容器的反轉。這些框架可用於將抽象類(IProductRepository)鏈接到基於xml配置的具體類(ProductXmlRepositoryProductXmlRepository)。

0

您的應用程序的解決方案應該遵循依賴倒置原則(http://deviq.com/dependency-inversion-principle/)來構建的,因此有最低的三個項目:

  • 核心
  • 基礎設施
  • 你的UI項目

所有(或幾乎所有)接口應該在Core中聲明(例如IProductRepository)。您的接口實現屬於引用Core的基礎架構。最後,你的UI項目應該引用Core,但不一定是基礎設施(學習如何使用項目中的類型而不參考它:http://blog.falafel.com/use-types-from-project-without-referencing/)。使用此體系結構,可以使用依賴注入(http://deviq.com/dependency-injection/)在運行時注入給定類型的所需實現,這提供了極大的靈活性和可測試性。

由於傳統的UI->業務層 - >數據層設置不允許您反轉依賴關係,所以使用此方法成功設置解決方案並保證項目之間的適當依賴關係是至關重要的。一旦以這種方式設置瞭解決方案,您應該在所有UI和服務代碼中遵循顯式依賴關係原則(http://deviq.com/explicit-dependencies-principle/)。