【发布时间】:2015-11-07 11:02:58
【问题描述】:
我一直在尝试了解服务层和存储库模式的工作原理。到目前为止,我已经编写了一个服务层和一个简单的存储库模式接口。但是,我经常看到一些文章指出,存储库模式允许在无需更改使用代码的情况下交换不同的数据存储。
就我而言,我希望能够支持将应用程序数据读取和写入 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 服务的不同服务吗?
我想我肯定不明白如何正确实现存储库模式和服务层。我应该如何实际设计存储库模式和服务层?
【问题讨论】:
-
Service 的构造函数应该接受
IProductRepository。现在您的服务对象将由ProductCsvRepository或ProductXmlRepository组成。在运行时,您可以发送两者中的任何一个来执行IProductRepository操作。
标签: c# .net oop design-patterns software-design