什么属于存储库,什么不存在?

时间:2009-08-19 15:35:09

标签: design-patterns repository-pattern

在实现存储库模式的ASP.NET MVC应用程序中,我很好奇是否适合将非数据相关方法放在存储库中,如果它们仍然属于给定存储库的一般焦点。例如,假设一个ProductsRepository具有添加和删除ProductImages的方法,这些方法在数据库和本地文件存储中也有部分表示。如果需要删除ProductImage,我们需要使用存储库方法从数据库中删除一行,并且还需要从存储介质中删除与该映像关联的文件。 IO操作是否属于存储库,还是有更合适的位置?

我在我刚刚描述的情况下做的一件事就是在我的存储库中提供静态方法,它通过使用存储在数据库中的文件名和预定义的目录模式为我提供给定ProductImage的路径以编程方式生成它。这是否超出了存储库的预期用途?


修改

如果这样的操作不属于存储库,那么类似的东西应该放在MVC模式中?在我看来,在Controller和Repository之间有另一层根据需要调用Repository可能是有意义的,并且可以从Controller静态调用。

3 个答案:

答案 0 :(得分:3)

我认为对存储库模式的更大关注是你违反了单一责任原则。您的班级应该承担一项责任,例如操纵数据库中的数据。您应该对文件IO有不同的类处理,并且可以将这些函数分组到一个类中。

只有一个原因可以让类更改,而处理文件IO和db调用的存储库类将有两个。更改文件系统布局或更改数据库。

修改

为了解决您的编辑问题,我将在MVC场景中实现这一点(这也假设您正在使用某种依赖注入来简化生活)。

// Controller class
public class ProductsController
{
    private IProductService _productService;

    public ProductsController(IProductService productService)
    {
        _productService = productService
    }

    public void RemoveImage(int productId, int imageId)
    {
        _productService.RemoveImage(productId, imageId)
    }
}

public class ProductService: IProductService
{
    private IProductRepository _productRepository;
    private IProductImageManager _imageManager;

    public ProductService(IProductRepository productRepository, IProductImageManager imageManager)
    {
      _productRepository = productRepository;
      _imageManager = imageManager;
    }

    public void RemoveImage(int productId, int imageId)
    {
        // assume some details about locating the image are in the data store
        var details = _productRepository.GetProductImageDetails(productId, imageId);
        // TODO: error handling, when not found?
        _imageManager.DeleteImage(details.location);
        _productRepository.DeleteImage(productId, imageId)
    }
}

然后根据具体需求的具体实现,根据您的具体需求实现IProductImageManager和IProductRepository。

答案 1 :(得分:2)

我最近设计了一个新的存储库并且遇到了同样的问题。我最终在存储库中包含了我的其他方法。

现在回过头来看,我认为更好的解决方案是保持我的存储库更加专注,并将我的其他方法放入与我的存储库紧密集成的服务中。

对于上面的示例,您可以在ProductsService中使用“DeleteProductImage”方法调用ProductsRepository.DeleteImage&然后还处理从存储介质中删除图像。

这使您的存储库保持干净并专注于“DeleteImage”逻辑,同时仍然提供您需要调用的单个方法(“DeleteProductImage”),该方法负责调用存储库以删除图像,同时还处理与之交互存储介质以及删除与您的存储库不直接相关的映像时可能需要执行的任何其他操作。

答案 2 :(得分:1)

存储库用于隔离应用程序与存储数据的方式和位置的关注点。在此基础上,存储库绝对是在此上下文中处理数据库和基于文件的活动的正确位置。

相关问题