Все пытаюсь выяснить правильное определение паттерна репозитория.
Мое первоначальное понимание было таким (чрезвычайно тупым)
- Отделите свои бизнес-объекты от объектов данных
- Стандартизируйте методы доступа на уровне доступа к данным.
Я действительно видел две разные реализации, и в сети нет формальных примеров, те, которые я видел, спрятаны в книгах.
Реализация 1:
public Interface IRepository<T>{
List<T> GetAll();
void Create(T p);
void Update(T p);
}
public interface IProductRepository: IRepository<Product> {
//Extension methods if needed
List<Product> GetProductsByCustomerID();
}
Реализация 2:
public interface IProductRepository {
List<Product> GetAllProducts();
void CreateProduct(Product p);
void UpdateProduct(Product p);
List<Product> GetProductsByCustomerID();
}
Обратите внимание, что первый - это общий Get / Update / GetAll и т. Д., Второй - это больше похоже на то, что я бы определил как «DAO».
Оба разделяют извлечение из ваших объектов данных. Что мне нравится, но я могу сделать то же самое с простым DAO. Однако вторая часть стандартизирует операции доступа, в которых я вижу ценность, если вы реализуете это в масштабе предприятия, люди легко узнают набор методов доступа для вашего репозитория.
Я ошибаюсь, полагая, что стандартизация доступа к данным является неотъемлемой частью этого шаблона? Если оба верны, почему следует выбрать реализацию 2?
Rhino имеет хорошую статью о реализации 1, и, конечно же, у MS есть расплывчатое определение и пример реализации. 2 находится здесь.