6

Я использую asp.net mvc с инфраструктурой сущности и начинаю изучать DDD. Я работаю над проектом, который содержит обзоры. Вот моя модель предметной области:Каков наилучший способ создания модели просмотра?

public class Survey 
{ 
    public int? SurveyID { get; set; } 
    public string Name { get; set; } 
    public decimal MinAcceptanceScore { get; set; } 
    public int UserFailsCount { get; set; } 

    public IEnumerable<SurveyQuestion> Questions { get; set; } 
    public IEnumerable<Prize> Prizes { get; set; } 
    public IEnumerable<SurveyAttempt> UserAttempts { get; set; } 
} 

мне нужны разные части изысканий для различных взглядов, так что я создал различные ViewModels:

public class ShortSurveyViewModel 
    { 
     public int? SurveyID { get; set; } 
     public string Name { get; set; } 
     public int UserFailsCount { get; set; } 
     public IEnumerable<SurveyAttempt> UserAttempts { get; set; } 
    } 

    public class ShortSurveyWithPrizesViewModel 
    { 
     public int? SurveyID { get; set; } 
     public string Name { get; set; } 
     public int UserFailsCount { get; set; } 
     public IEnumerable<SurveyAttempt> UserAttempts { get; set; } 
     public IEnumerable<Prize> Prizes { get; set; } 
    } 

    public class SurveyEditViewModel 
    { 
     public int? SurveyID { get; set; } 
     public string Name { get; set; } 
     public decimal MinAcceptanceScore { get; set; } 
     public int UserFailsCount { get; set; } 

     public IEnumerable<SurveyQuestion> Questions { get; set; } 
     public IEnumerable<Prize> Prizes { get; set; } 
    } 

Что бы лучший способ построить свою архитектуру, если я хочу, чтобы мои репозиторий для получения информации, необходимой для модели одобрения?

Различные solusions, что я вижу:

  1. Repository может вернуться IQueryable в SurveyService и сервис может вернуть модель представления appropriete, но я стеснялся, что делает это правильно, потому что я думаю, что вид модели должны быть созданы в пользовательском интерфейсе , а не Сервисный уровень.

  2. Создайте три подходящих класса в моем доменном слое. Но теперь домен будет зависеть от представления и при каждом новом представлении должен быть создан новый класс домена.

  3. Получить полный объект домена и отобразить только объекты, необходимые для конкретного вида. Это не хорошо, потому что в моем примере вопросы нужны только в одном представлении, и это может быть тяжелая коллекция.

+1

использование частичных просмотров –

+1

ViewModels должны жить в пользовательском интерфейсе и заселяться в контроллере. Уровни DAL и домена не должны знать о них –

+0

@DaveA Я буду использовать частичные виды, но вопрос не в этом. Я спрашиваю о оптимальном способе построения моделей моего представления. –

ответ

8

домена Driven Design:

  • Вы должны иметь хранилище возвращающегося совокупный корень - в вашем случае Survey и все отношения, которые не могут существовать без родительского Survey
  • Это хранилище будет загружаться всегда весь Survey класс и в зависимости от ваши требования только некоторые отношения (действительно догматический DDD всегда будет загружать весь агрегат, но это не очень хороший подход для веб-сайта без учета состояния).
  • Ваш прикладной уровень (контроллер) запросит репозиторий для Survey и выберет отношения и отобразит модели.

Луковый архитектура:

  • Вы создадите некоторое хранилище разоблачением IQueryable<Survey> - еще хуже, вы будете использовать общий репозиторий с интерфейсом CRUD
  • Вы будете создавать некоторые службы призывающую хранилищу и строительство Linq-на-субъектов проекция в ваши DTO и возврат их на прикладной уровень (контроллер)
  • Теперь что? Вы можете использовать эти DTOs непосредственно или использовать другой набор предметов, используемых в качестве вашей модели зрения с некоторыми атрибутами, связанные с UI и т.д. Существует, очевидно, что-то не так ...

Простая архитектура:

  • Вы будете использование впрыскивается IDbSet<Survey> непосредственно в контроллере как хранилище
  • Вы сделать Linq-на-проекции образований непосредственно в контроллере, чтобы заполнить вид модели

Ther e не лучший способ. Это всегда о вашей цели и ваших ожиданиях. Для небольших приложений вы можете жить с простой архитектурой без каких-либо проблем.

Домен управляемый дизайн более сложный. Основной концепцией DDD являются объекты домена, объекты ценности и их состав. Объект домена инкапсулирует данные и логику, выполненные по этим данным. DDD не работает с частичными данными или DTO - когда ваши объекты домена не имеют никакой логики, вы делаете это неправильно (это называется анемической моделью). Служба в DDD не является посредником между уровнем приложения и репозиторием. Он используется для обработки бизнес-логики, которая не связана с единственным доменным объектом (поэтому не может быть инкапсулирована в сущности домена). Репозиторий - это код инфраструктуры, необходимый для материализации ваших агрегатов из хранилища и сохранения их в хранилище. Логика приложения (контроллер) может взаимодействовать с объектами домена, службами и кодом инфраструктуры.

Мне не нравится луковая архитектура.

+0

Это хорошо продуманное объяснение. Интересно, можете ли вы рассказать о том, почему вам не нравится архитектура лука и, возможно, объясните, почему, очевидно, что-то не так ... У меня недостаточно опыта, чтобы это было очевидно для меня. Также я не совсем понимаю разницу между третьей пулей под DDD и третьей пулей в Onion. Разве вы не находитесь в том же месте, то есть контроллере, в котором сейчас находятся объекты домена (объекты в одном случае и DTO в другом), которые он будет отображать на модели просмотра? Я не играю адвоката дьявола, просто пытаюсь учиться. –

+0

Спасибо, Ладислав. Очень информативный ответ. Но я не понимаю, почему вам не нравится луковая архитектура. Из вашего ответа я понял, что это может быть лучший выбор, потому что простая архитектура не соответствует моим потребностям, и DDD может быть не лучшим для веб-сайта без гражданства. И если бы это было не очень догматическое DDD, возможно, некоторые свойства Survey не были заполнены данными? –

+1

@ Сорок два: Это только мое личное мнение из предыдущего опыта. Архитектура лука, на мой взгляд, приводит к избыточным слоям. Я даже работал над проектами, в которых эти слои были разделены на подслои. В конце проекта у нас было только много кода, где методы верхнего уровня имеют только одну строку кода, вызывающую нижний уровень. Любые дополнительные функции требовали обновления так много файлов, чтобы что-то распространять. Это действительно было плохо. –

0

Учитывая тот факт, что ваша главная задача является объем данных извлекается из модели данных в сопоставлении с количеством данных, необходимых в виде модели, я бы сказал, что правильный подход для вас будет строить просмотров в базы данных и их соответствующих моделей данных.

Это позволит вам обрезать объем данных, извлекаемых из базы данных, в любой поездке.

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

+0

Я правильно понял, что у меня должны быть две точные модели (одна в слое данных, другая в презентации), и если я изменю один, другой тоже будет изменен? –

+0

@AlexeyAza: у вас будут две модели, модель данных (в слое данных) и модель представления (в слое представления с контроллерами), но ключ в том, что я думаю, что вы захотите создать Views в а не просто собирать данные из таблицы все время. Это означает, что у вас будут модели данных, которые соответствуют Views, а модели просмотра, вероятно, будут во многом похожи на эти модели данных. Когда вы можете извлекать данные непосредственно из таблицы, используйте стандартную модель данных для своей таблицы и сопоставьте ее с моделью просмотра. –

+0

Возможно, это имеет смысл. Но давайте представим ситуацию, когда мои вопросы имеют подкачки. Где бы вы его применили? –