Linq to Sql, репозитории и Asp.Net MVC ViewData: как удалить избыточность? - PullRequest
0 голосов
/ 06 апреля 2010

Linq to SQL создает объекты, которые являются IQueryable и полны отношений.
Html-помощникам требуются определенные объекты интерфейса, такие как IEnumerable<SelectListItem>.

То, что я думаю, могло произойти:

  • Повторно использовать объекты из Linq в SQL без всего багажа, т.е. возвращать Pocos из объектов Linq в SQL без дополнительных классов доменной модели?
  • Извлечение объектов, которые легко преобразуются в (или являются) вспомогательные объекты HTML, такие как перечисление SelectListItem?

Есть ли способ сделать это, не нарушая разделения интересов? Какой-то изворотливый трюк для удовлетворения потребностей?

Например, если бы это было в репозитории, SelectListItem не был бы там. select new - это хороший способ вырезать объект из Linq в SQL без багажа, но он по-прежнему ссылается на класс, на который нельзя ссылаться:

 IEnumerable<SelectListItem> result = (from record in db.table
                                       select new SelectListItem {
                                           Selected = record.selected,
                                           Text= record.Text, 
                                           Value= record.Value }
                                      ).AsEnumerable();

Ответы [ 2 ]

2 голосов
/ 06 апреля 2010

Я видел пользователя интерфейса IService и класса обслуживания. По сути, это шаг между хранилищем и контроллером.

Плюсы:

  • Позволяет использовать методы, управляющие возвращаемыми значениями действий IRepository
  • Хорошее разделение интересов
  • Может быть мостом, на котором живет логика проверки до того, как будет задействован репозиторий.
  • Может работать с каркасами / шаблонами внедрения зависимостей

Минусы:

  • Mucho дублирование кода. Если вы не выставите репозиторий, вы, вероятно, будете дублировать почти все ваши методы IRepository в IService
  • Может стать универсальным классом. Бог класс, который делает все! Муахахаха ... и т. Д.

Я уверен, что есть и другие, но это то, что я видел и использовал.

1 голос
/ 06 апреля 2010

В этом конкретном примере вы можете создать метод ToSelectListItem () или аналогичный в вашем частичном определении класса, чтобы удалить дублирование.Или, возможно, было бы лучше использовать метод расширения, чтобы избежать некоторой связи там.

Редактировать: Я обычно использую веб-службы JSON с DTO.У меня может быть ProductDto, который является моим упрощенным JSON-дружественным представлением моей сущности Product L2SQL.Тогда мне просто нужно вызвать select ProductDto.FromProduct (product) в моем запросе.Дублирование теперь минимально.

...