Ради этого обсуждения давайте предположим, что ваш интерфейс хранилища выглядит примерно так:
public interface IRepository<T>{
T GetById(int id);
IQueryable<T> All();
void Add(T entity);
void Remove(T entity);
}
И хотя вы правы в том, что реализация репозитория для каждого типа Product
не требуется, вы можете создать универсальный класс-оболочку, который реализует интерфейс, как если бы он был выделенным репозиторием. Например,
public class RepositoryWrapper<T,TBase> : IRepository<T> {
where T: TBase
private readonly IRepository<TBase> _repository;
public RepositoryWrapper(IRepository<TBase> repository){
_repository = repository;
}
public T GetById(int id){
return (T)_repository.GetById(id);
}
public IQueryable<T> All(){
return _repository.All().OfType<T>();
}
public void Add(T entity){
_repository.Add(entity);
}
public void Remove(T entity){
_repository.Remove(entity);
}
}
Ваш вариант использования будет RepositoryWrapper<Clothing,Product>
, и вы можете упростить создание с помощью метода расширения, такого как:
public static class SubRepositories{
public static IRepository<TDerived> GetSubClassRepository<TBase,TDerived>(this IRepository<TBase> repository)
where TDerived: TBase
{
return new RepositoryWrapper<TDerived,TBase>(repository);
}
}
Теперь, что касается модели представления, вам не нужно указывать точный тип модели представления при передаче его в ваш контроллер. Альтернативой является использование шаблонов для автоматического определения типа представления для визуализации на основе ModelMetadata .