我一直在尝试学习服务层和存储库模式是如何工作的。到目前为止,我已经写了一个服务层和一个简单的存储库模式接口。但是,我经常看到一些文章指出,存储库模式允许在不消耗代码的情况下更换不同的数据存储库。使用存储库模式提供对不同数据存储的访问
在我的情况下,我希望能够支持读取和写入应用程序数据到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服务的不同服务吗?
我想我很不明白如何正确实现存储库模式和服务层。我应该如何设计存储库模板和服务层?
你的服务的构造函数应该接受一个'IProductRepository'。现在你的服务对象将由'ProductCsvRepository'或'ProductXmlRepository'构成。在运行时,您可以发送两者中的任意一个来执行“IProductRepository”操作。 – singsuyash