Я думаю, что большее беспокойство по поводу модели хранилища связано с тем, что вы нарушаете принцип единой ответственности. Ваш класс должен нести одну ответственность, например, манипулировать данными в базе данных. У вас должна быть другая классовая сделка с File 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 на основе любого интерфейса, который имеет смысл с конкретными реализациями для ваших конкретных потребностей.