Не уверен, почему у вас есть два параметра типа в репозитории - в чем смысл?
* Вот классический пример репозитория .NET с использованием Generics: *
* Во-первых, интерфейс репозитория: *
public interface IRepository<T> where T : class
{
T FindSingle(Expression<Func<T,bool>> predicate);
IQueryable<T> FindAll(); // optional - matter of preference
void Add(T entity);
void Remove(T entity);
}
* Во-вторых, универсальная реализация репозитория (например, EF): *
public abstract class GenericRepository<T> : IRepository<T>
{
private IObjectSet<T> _ObjectSet; // get this in via DI (for example)
public T FindSingle(Expression<T,bool>> predicate)
{
return _ObjectSet.SingleOrDefault(predicate);
}
// you can figure out how to do the other implementation methods
}
* Затем, Конкретный репозиторий (у вас должно быть по одному на корень совокупности, а также интерфейс для каждого конкретного репозитория, детализирующий конкретные методы): *
public EmployeeRepository : GenericRepository<Employee>, IRepository<Employee>
{
// all regular methods (Find, Add, Remove) inherited - make use of them
public Employee FindEmployeeByName(string name)
{
return FindAll().SingleOrDefault(x => x.Name == name);
// or you could do: return FindSingle(x => x.Name == name);
}
}
Использование:
IRepository<Employee> repository = new EmployeeRepository<Employee>();
Не думайте, что вам нужно сходить с ума от дженериков - единственное, что вам нужно, - это ограничить использование репозитория сущностью, которая заключена в капсулуРепозиторий.
Я просто использую where T : class
.
Другое использование where T : IDomainAggregate
или подобное, чтобы наложить ограничения на фактический тип объекта, который разрешен.