2012-04-24 3 views
0

У меня есть модель, которая может использоваться в контроллерах, представлениях и ядре. Core - это отдельный проект, в то время как Controllers и View находятся в веб-проекте. Где лучше всего разместить ViewModel, это в веб-проекте или в ядре, или мне нужно создать отдельный проект только для модели просмотра?Куда поместить ViewModel

ответ

0

Модель представления, как правило, представляет собой оболочку вокруг модели, которая имеет данные в формате UI. Вероятно, вы должны сохранить класс модели в проекте Core и классе модели представления в своем веб-проекте.

Конструктор класса View Model может принимать экземпляр вашего класса модели (и любые другие объекты, которые необходимо заполнить), и генерировать правильные данные просмотра. Например, если у модели есть объект DateTime, то ваша модель представления может иметь соответствующее свойство String, которое содержит DateTime в том формате, который вы хотите показать.

+0

так как я могу использовать модель представления в ядре? Нужно ли ссылаться на класс веб-проектов? – user335160

+0

В обратном порядке. Веб-проект ссылается на ваш основной проект. Я обновил свой ответ –

+0

Ну, теперь я запутался, потому что использовал автопарпер для отображения ViewModel и Model. Если я создам экземпляр модели в конструкторе, мне кажется, что мне не нужен Automapper? – user335160

0

Поскольку ViewModels специфичны для представлений, я обычно создавал бы папку ViewModel в моем проекте пользовательского интерфейса и сохранял бы ее там.

enter image description here

Я создам отдельный Service Layer (другой проект) для преодоления данных между моими ViewModels и сущностями моделью. Способы действия My Controller вызовут уровень сервиса с объектом ViewModel.

+0

На самом деле у нас такой же дизайн, можете ли вы отправить мне пример кода вашего уровня обслуживания и контроллера, который возвращает ViewModel? Для меня правильно понять. – user335160

1

У меня есть модель, которая может использоваться в контроллерах, представлениях и ядре.

Нет. Вы не используете его в ядре. Google «Разделение проблем». Ответственность модели представления заключается в представлении Модели (основного проекта) в представлении. Его нельзя использовать ни для чего другого. Я писал о просмотре модели здесь: http://blog.gauffin.org/2011/07/three-reasons-to-why-you-should-use-view-models/

Это ответственность контроллеры взять все от модели (основного проекта) и создать соответствующую модель представления.

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

Update

Пример использования AutoMapper:

public class FlairController 
{ 
    public FlairController(IYourServiceOrRepository repos) 
    { 
    } 

    public ActionResult Details(int id) 
    { 
     SomeCoreObject entity = _repos.Get(id); 
     FlairViewModel model = new FlairViewModel(); 
     Mapper.Map(entity, model); 
     return View(model); 
    } 
} 

Ваш пример кода (в комментарии) как метод будет выглядеть без рамок отображения.

+0

Вот моя структура проекта Веб-сайт - Виды Контроллеры - все контроллеры здесь (путайте, если я его положу здесь) Core - содержит конфигурацию Auto Mapper, класс Mapper, сопоставление MapView и сервисы (ViewModel используют здесь, чтобы вернуть данные, которые мне нужны) Класс DataAccess-Repository Модель, сгенерированная EF – user335160

+0

Модели представления и конфигурацию automapper между моделями просмотра и основными моделями должны быть помещены в UI (проект MVC3), поскольку Core не должен ничего знать в слое пользовательского интерфейса. Ваши сервисы не должны использовать модели представления, поскольку они предназначены для отображения HTML – jgauffin

+0

, можете ли вы привести здесь примеры кодов относительно подхода, о котором вы упоминали, на самом деле я сейчас очень смущен, потому что, поскольку я думаю о том, что вы говорите есть, контроллер имеет этот пример кода возврата View ( вид, новый FlairViewModel { ужинов = dinners.ToList(), LocationName = string.IsNullOrEmpty (location.City) "вы": String.Format ("{ 0}, {1} ", location.City, location.RegionName) } ); – user335160

Смежные вопросы