Linq 2 Sql - Как спроектировать правильный репозиторий, контроллер и модель представления с наследованием сущностей - PullRequest
5 голосов
/ 15 июня 2011

Вопрос: Мне интересно, какой тип разработки / рабочего процесса в репозитории и контроллере используют люди при использовании наследования сущностей в ORM, в данном случае LINQ 2 SQL с MVC .NET.

У меня очень простая иерархия, в которой класс одежды (конкретный) наследуется от продукта (абстрактный класс).Однако это несколько усложняет дизайн.Было бы глупо создавать класс репозитория для каждой конкретной реализации Product, поэтому я использую Product в качестве типа параметра и типа возврата в моем репозитории «Product».«Однако из-за этого я должен привести тип Product к конкретной реализации Product (либо до запроса из репозитория, либо после).

Еще одна вещь, которую я заметил, заключается в том, что даже если я определю правильный тип для приведениячтобы, я должен определить свои модели представления, чтобы перейти к моему представлению для каждой конкретной реализации продукта.

Если это то, что нужно сделать, пусть будет так, но мне интересно, что думают другие людии / или опыт есть.

Ответы [ 3 ]

1 голос
/ 23 июня 2011

Ради этого обсуждения давайте предположим, что ваш интерфейс хранилища выглядит примерно так:

 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 .

0 голосов
/ 24 июня 2011

Я использую Linq to Sql в приложении MVC, и у меня есть некоторое наследование таблиц для представления элементов на «полу». У меня есть базовая «таблица» и 2 таблицы, которые связываются с базовой таблицей, а затем расширяют базовую таблицу, добавляя свои собственные столбцы.

Для меня, поскольку мои вложенные таблицы не слишком сильно отклоняются от базовой таблицы, я создаю представление базы данных, которое возвращает все столбцы базовой таблицы плюс ключевые дополнительные столбцы из производных таблиц и «тип» определить, что они есть. Мой репозиторий затем работает с этим представлением базы данных.

Это может быть полезно для вас в качестве подхода, в зависимости от того, сколько подтипов у вас есть, насколько они различаются и ваших требований. В противном случае, @smartcaveman сделал хорошее предложение.

0 голосов
/ 22 июня 2011

Это звучит довольно близко к вашему вопросу:

Шаблон репозитория и наследование в .net

...