Я работаю над приложением, для которого мне нужно написать уровень доступа к данным. Моя первая мысль заключалась в создании кучи репозиториев для каждой сущности, которая мне нужна, но теперь я столкнулся с проблемой с разделением различных действий репозитория. Я хотел бы услышать ваши мысли об этом.Различные реализации репозитория базы данных за одним интерфейсом
Прежде всего, я хотел бы поддержать два типа связи с базой данных - прямые запросы sql (например, вставить, обновить и т. Д.) И объемные вставки, такие как загрузка данных из файла (или другого источника). Тем не менее, оба эти осуществлений делать разные вещи:
- Простого хранилище выстреливает запрос к SQL серверу
- Объемное хранилище первым добавляет запись в файл или в памяти. После обработки всех записей он синхронизируется с базой данных.
Моя первая попытка классовой структуры для этого:
public class Product{
}
public interface IProductRepository {
Product GetProduct(int id);
void CreateProduct(Product p);
}
public class SqlProductRepository : IProductRepository
{
public Product GetProduct(int id)
{
throw new NotImplementedException();
}
public void CreateProduct(Product p)
{
throw new NotImplementedException();
}
}
public class BulkLoadRepository : IProductRepository
{
public Product GetProduct(int id)
{
throw new NotImplementedException();
}
public void CreateProduct(Product p)
{
throw new NotImplementedException();
}
}
Тем не менее, эта структура отсутствует функцию синхронизации в конце для объемного хранилища. Если я добавлю функцию Sync(), мне нужно будет оставить ее пустой для «простого» репозитория.
Любые мысли о том, как поддерживать обе функции, но все же скрывать их за одним интерфейсом?
Заранее благодарен!
Я хотел бы иметь отдельный интерфейс для каждого типа объекта, чтобы контролировать функциональные возможности поддерживаются. Мне нравится ваша идея над вторым интерфейсом - я думаю, что это то, с чем я иду. Это также позволит мне проверить, реализует ли репозиторий ICommitChanges - синхронизировать изменения с db. – sTodorov