У меня есть модель, которая может использоваться в контроллерах, представлениях и ядре. Core - это отдельный проект, в то время как Controllers и View находятся в веб-проекте. Где лучше всего разместить ViewModel, это в веб-проекте или в ядре, или мне нужно создать отдельный проект только для модели просмотра?Куда поместить ViewModel
ответ
Модель представления, как правило, представляет собой оболочку вокруг модели, которая имеет данные в формате UI. Вероятно, вы должны сохранить класс модели в проекте Core и классе модели представления в своем веб-проекте.
Конструктор класса View Model может принимать экземпляр вашего класса модели (и любые другие объекты, которые необходимо заполнить), и генерировать правильные данные просмотра. Например, если у модели есть объект DateTime, то ваша модель представления может иметь соответствующее свойство String, которое содержит DateTime в том формате, который вы хотите показать.
Поскольку ViewModels специфичны для представлений, я обычно создавал бы папку ViewModel в моем проекте пользовательского интерфейса и сохранял бы ее там.
Я создам отдельный Service Layer (другой проект) для преодоления данных между моими ViewModels и сущностями моделью. Способы действия My Controller вызовут уровень сервиса с объектом ViewModel.
На самом деле у нас такой же дизайн, можете ли вы отправить мне пример кода вашего уровня обслуживания и контроллера, который возвращает ViewModel? Для меня правильно понять. – user335160
У меня есть модель, которая может использоваться в контроллерах, представлениях и ядре.
Нет. Вы не используете его в ядре. 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);
}
}
Ваш пример кода (в комментарии) как метод будет выглядеть без рамок отображения.
Вот моя структура проекта Веб-сайт - Виды Контроллеры - все контроллеры здесь (путайте, если я его положу здесь) Core - содержит конфигурацию Auto Mapper, класс Mapper, сопоставление MapView и сервисы (ViewModel используют здесь, чтобы вернуть данные, которые мне нужны) Класс DataAccess-Repository Модель, сгенерированная EF – user335160
Модели представления и конфигурацию automapper между моделями просмотра и основными моделями должны быть помещены в UI (проект MVC3), поскольку Core не должен ничего знать в слое пользовательского интерфейса. Ваши сервисы не должны использовать модели представления, поскольку они предназначены для отображения HTML – jgauffin
, можете ли вы привести здесь примеры кодов относительно подхода, о котором вы упоминали, на самом деле я сейчас очень смущен, потому что, поскольку я думаю о том, что вы говорите есть, контроллер имеет этот пример кода возврата View ( вид, новый FlairViewModel { ужинов = dinners.ToList(), LocationName = string.IsNullOrEmpty (location.City) "вы": String.Format ("{ 0}, {1} ", location.City, location.RegionName) } ); – user335160
- 1. Куда поместить Testdata?
- 2. Куда поместить Constants.swift?
- 3. Изменение куда поместить текст
- 4. Куда поместить метод?
- 5. Куда поместить WebRequest.RegisterPrefix()
- 6. Куда поместить утверждения?
- 7. UITabBarControllerDelegate - Куда поместить код?
- 8. Куда поместить функцию заголовка
- 9. Куда поместить Root Controller?
- 10. Куда поместить сценарии PowerShell?
- 11. Куда поместить документирующие комментарии?
- 12. Куда поместить файл свойств?
- 13. Куда поместить модель AngularJS?
- 14. Куда поместить внутренние классы?
- 15. Куда поместить try catch
- 16. Куда поместить «плагины» в linux
- 17. Куда поместить данные проверки Скалы
- 18. Emacs: Куда поместить файл psvn.el?
- 19. Rails - куда поместить файлы данных?
- 20. Куда поместить файлы конфигурации Coherence?
- 21. Куда поместить Apache Pig UDF?
- 22. Куда поместить функциональный код фрагмента?
- 23. Куда поместить деньги в проект?
- 24. Куда поместить загруженный пакет java?
- 25. Куда поместить секреты приложения OAuth
- 26. Куда поместить пользовательские методы проверки?
- 27. Rails: куда поместить статистический код?
- 28. Куда поместить ожидание этой функции?
- 29. Куда поместить математические вычисления в Rails?
- 30. .config, .run, AppCtrl - куда поместить маршруты?
так как я могу использовать модель представления в ядре? Нужно ли ссылаться на класс веб-проектов? – user335160
В обратном порядке. Веб-проект ссылается на ваш основной проект. Я обновил свой ответ –
Ну, теперь я запутался, потому что использовал автопарпер для отображения ViewModel и Model. Если я создам экземпляр модели в конструкторе, мне кажется, что мне не нужен Automapper? – user335160