Я полностью согласен с Марком в этом, но добавлю немного больше. Когда вы посмотрите на преимущества создания универсального репозитория, общий шаблон - это IRepository и Repository. Одна вещь, которую я нахожу гораздо более полезной, раскрытая Джереми Д. Миллером (не могу найти ссылку), - это наличие дженериков на уровне метода.
Так что у моего IReposity будут такие методы:
T FindByKey<T>(int key);
IEnumerable<T> FindAll();
T FindBy<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression);
void Update<T>(entity);
Затем, в зависимости от вашей философии, вы можете передать класс Repository и напрямую запросить его, или сделать реализацию Repository абстрактной и принудительно инкапсулировать ее использование в явном хранилище, например:
CrmRepository : Repository
{
FindByCustomerId(int customerId)
{ return FindByKey<Customer>(customerId);}
}