Konkretne repozytoria mogą mieć wspólne bazowe repozytorium generyczne, które realizuje wspólne zadania. Jest to dobre podejście gdy repozytorium jest wraperem na ORMa, a ten posiada generyczne API.
Czyli coś takiego:
public class Repository<TEntity>
{
public void Add(TEntity ent);
public void Delete(TEntity ent);
public void Update(TEntity ent);
public IEnumerable<TEntity> GetAll();
}
public class ClientRepository: Repository<Client>
{
public IEnumerable<Client> GetClientsWithBigPenis();
}
zgadza się?
Jeśli repozytorium zawiera jakieś ręczne budowanie zapytań, to niekoniecznie jest sens wydzielać coś bazowego, a zwłaszcza >generycznego.
Ale czemu nie? Przecież w repozytorium mam jakiś data kontekst, który może budować pytania dynamicznie za pomocą np. jakiś atrybutów. Coś w deseń:
public class DataContext<TEntity>
{
public void AddEntity(TEntity ent)
{
string tableName = ent.GetType().GetAttributeValue("TableName"); //pseudokod
}
}
Czyli w klasie Client muszę mieć tylko atrybut TableName (nie wiem, czy to dobre). A nazwami pól będą po prostu nazwy właściwości. Tak chyba działają ORMy, nie?
Błędem jest wypuszczanie repozytorium generycznego do logiki biznesowej, bo ideą repozytorium jest bycie specjalizowaną kolekcją. A generyczny jest przeciwieństwem specjalizowanego.
Ogólnie czego nie zrobisz, to i tak na 95% nie wyjdzie Ci repozytorium tylko zwykłe DAO.
A czy repozytorium nie jest takim przykładem DAO?