Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, уважаемые! Делаю приложение на ASP.NET MVC из 2-ух проектов: 1-ый для работы с БД, так называемый Репозиторий. В нём функции выдающие данные и сохраняющие их. 2-ой для всего остального: т.е. для Контроллеров, Моделей представлений, Представлений. Постепенно методы контроллеров загромоздились логикой приложения, стали очень большими, трудными для восприятия. Может, правильно будет добавить 3-й проект, чисто для логики приложения? Чтобы он связывался с Репозиторием. А проект для web-интерфейса, чтоб ничего про Репозиторий не знал, вызывал бы только методы приекта-логики. Как грамотно построить приложение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 10:09 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
Andrey_VPМожет, правильно будет добавить 3-й проект, чисто для логики приложения? Можно проект, можно неймспейс, зависит от масштаба. Расслаивать логику это правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 11:00 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
Andrey_VPА проект для web-интерфейса, чтоб ничего про Репозиторий не знал, вызывал бы только методы приекта-логики. 1. Так не надо делать. Зачем дублировать в болшьей части доступ к данным, особенно если это касается банальных CRUD. 2. Приложение должно общаться и с репозиторием (датасервисом) и с сервисом логики. 3. Сервис логики, как уже сказали, можно размещать как в отдельной сборке, так и в отдельном неймспейсе твоего репозитория (датасервиса). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 11:06 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответы! Но есть один затык. Логика приложения тесно общается с Репозиторием. Связь с Репозиторием я поддерживаю через DI Ninject, слелав его DefaultControllerFactory (я получаю доступ к Репозиторию в конструкторе контроллера). Если же я вынесу логику за пределы контроллера, то как сделать её общение с Репозиторием? Мне бы хотелось прямо в логике работать с БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 11:43 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
1. Делаешь базовый контроллер 2. В нём прокидываешь 2 ленивых свойства Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 3. Всё. Все твои контроллеры могут общаться со слоем данных и со слоем логики. Никаких дефолтных фабрик, никакого мусора в конструкторах унаследованных контроллеров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 11:56 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
А если я перенесу логику в сборку Репозитория, тогда я не смогу получить доступ к моделям представления. (Многие методы логики возвращают модель или List<модель> представления). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 12:00 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
Andrey_VPА если я перенесу логику в сборку Репозитория, тогда я не смогу получить доступ к моделям представления. (Многие методы логики возвращают модель или List<модель> представления). 1. Моделям представления вообще нечего делать в репозитории - это уровень твоего mvc приложения. Ты должен маппить в контроллере выхлоп от репозитория в модель представления и скармливать её во вью. 2. Возвращать List<T> дурной тон. Используй подобное в реализации, а наружу в сигнатуры тащи IEnumerable или IList. 3. Методы логики могут возвращать IEnumerable<T>, да. А контроллер должен это отдавать в модель пресставления. Код: c# 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 12:19 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
Andrey_VPЛогика приложения тесно общается с Репозиторием.Вот и вынеси работу с репозиторием в отдельный слой логики. В MVC это называется Model Контроллер ничего не должен знать о репозитории, только о модели (слой логики). Пример: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. IPage и IPageService - это Model (слой логики), IPageConverter - это mapper из Model во ViewModel и обратно. Пример реализации IPageService: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 12:53 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
Andrey_VPМногие методы логики возвращают модель или List<модель> представления. cooldeveloper2Ты должен маппить в контроллере выхлоп от репозитория модели в модель представления и скармливать её во вью. +1 В MVC (Model View Controller) логика == Model. То есть методы логики НЕ могут возвращать модель представления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 12:58 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
Что касается неймспейсов, то IPage, IPageService, их реализации: Page и PageService, - а также IPageRepository - это Код: c# 1. а конкретная реализация IPageRepository - это или Код: c# 1. или Код: c# 1. или Код: c# 1. или Код: c# 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 13:09 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
skyANAAndrey_VPМногие методы логики возвращают модель или List<модель> представления. cooldeveloper2Ты должен маппить в контроллере выхлоп от репозитория модели в модель представления и скармливать её во вью. +1 В MVC (Model View Controller) логика == Model. То есть методы логики НЕ могут возвращать модель представления. Догика может находиться в репозитории (датасервисе). Контроллер может обращаться к репозиторию (датасервису) через IoC, забирать результат и намапливать на модель представления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 13:17 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 13:19 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
cooldeveloper2Догика может находиться в репозитории (датасервисе). Контроллер может обращаться к репозиторию (датасервису) через IoC, забирать результат и намапливать на модель представления.О какой логике речь? В MVC бизнес-логика - это Model. А репозиторий инкапсулирует логику работы с данными и их распределением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 13:25 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
skyANA, что-то я запутался. Прошу учесть, что я ещё новичок в этом. У меня сложилось мнение, что модель представления - это всего лишь описание передаваемых в представление данных, вроде: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. А Вы пишите, что логику, включая работу с Репозиторием, надо писать в модели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 13:26 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
Andrey_VP, вы не путайте модель и модель представления. Это две разные вещи. Насчёт модели представления Вы всё правильно поняли. Но Вы не разобрались, что такое Model в MVC. Почитайте хотя бы ВикипедиЮ: Model-View-Controller . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 13:30 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
skyANA, почему "методы логики НЕ могут возвращать модель представления." ? Вот например: [HttpPost] метод контроллера получил модель представления. Мне её надо как-то обработать, и уже модифицированную послать обратно в представление. Модификация - это и есть логика. Результат модификации - модель представления. А раз логика - это модель, то почему "методы логики НЕ могут возвращать модель представления." ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 13:39 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
Andrey_VP, приведи пример кода контроллера, где формируется то, что ты называешь моделью представления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 13:41 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
skyANAcooldeveloper2Догика может находиться в репозитории (датасервисе). Контроллер может обращаться к репозиторию (датасервису) через IoC, забирать результат и намапливать на модель представления.О какой логике речь? В MVC бизнес-логика - это Model. А репозиторий инкапсулирует логику работы с данными и их распределением. О логике работе с данными. А логику в терминах MVC можно и в представлении сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 13:46 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
skyANA Код: c# 1. А в каком слое у вас маппинг (IPageConverter) ? Как происходит общение между слоями? К примеру: DbModel => DTO => ViewModel ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 13:55 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
cooldeveloper2skyANAпропущено... О какой логике речь? В MVC бизнес-логика - это Model. А репозиторий инкапсулирует логику работы с данными и их распределением. О логике работе с данными. А логику в терминах MVC можно и в представлении сделать.Ясно. Я же предлагаю "логику в терминах MVC" из контроллера вынести в модель (Model), куда же и знание о каком-то там репозитории переедет. Выдержка из статьи , что я упоминал выше.Наиболее частые ошибкиНачинающие программисты (особенно в веб-программировании, где аббревиатура MVC стала популярна) очень часто трактуют архитектурную модель MVC как пассивную модель MVC. В этом случае модель выступает исключительно совокупностью функций для доступа к данным, а контроллер содержит бизнес-логику. В результате код моделей по факту является средством получения данных из СУБД, а контроллер представляет собой типичный модуль, наполненный бизнес-логикой, или скрипт в терминологии веб-программирования. В результате такого понимания MVC разработчики стали писать код, который Pádraic Brady, известный в кругах сообщества Zend Framework, охарактеризовал как ТТУК — «Толстые тупые уродливые контроллеры» (Fat Stupid Ugly Controllers)[6]: Среднестатистический ТТУК получал данные из БД (используя уровень абстракции базы данных, делая вид, что это модель) или манипулировал, проверял, записывал, а также передавал данные в вид. Такой подход стал очень популярен потому, что использование таких контроллеров похоже на классическую практику использования отдельного php-файла для каждой страницы приложения.Но в объектно-ориентированном программировании используется активная модель MVC, где модель — это не только совокупность кода доступа к данным и СУБД, а вся бизнес-логика. В свою очередь, контроллеры представляют собой лишь элементы системы, в чьи непосредственные обязанности входит приём данных из запроса и передача их другим элементам системы. Только в этом случае контроллер становится «тонким» и выполняет исключительно функцию связующего звена (glue layer) между отдельными компонентами системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 13:55 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
skyANA, ну хотя бы вот: Код: c# 1. 2. 3. 4. 5. Сейчас getProcessMenuViewModel - это privat метод этого же контроллера: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 13:56 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
Andrey_VP, ну и наименования классов и переменных Вы используете. Хрен прочитаешь код. Насколько я могу судить, классы Ga, Ga2 и gaRepository - это у Вас Model (может gaRepository и нет, тут надо смотреть его реализацию). Код, что Вы привели - это mapping модели (Model) в модель представления (ViewModel). В моём примере этот mapping вынесен в IPageConverter. Код: c# 1. То есть это слой представления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 14:08 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
skyANAAndrey_VP, ну и наименования классов и переменных Вы используете. Хрен прочитаешь код. Насколько я могу судить, классы Ga, Ga2 и gaRepository - это у Вас Model (может gaRepository и нет, тут надо смотреть его реализацию). Код, что Вы привели - это mapping модели (Model) в модель представления (ViewModel). В моём примере этот mapping вынесен в IPageConverter. Код: c# 1. То есть это слой представления. В таком случае БЛ просачивается в слой представления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 14:15 |
|
||
|
Грамотная архитектура приложения на ASP.NET MVC
|
|||
|---|---|---|---|
|
#18+
Andrey_VP, идеальным для себя нашёл следующий подход: 1. MyProject — веб-приложение 2. MyProject.Data — данные 3. MyProject.Data.Access — доступ к данным 4. MyProject.Infrastructure — оснастка ... суперпозиция: — никогда ни при каких случаях, не делать из базового контроллера средство для доступа к данным, у контроллера должно быть минимум ответственности, что в свою очередь отменяет всякую необходимость делать собственную реализацию базового контроллера — ни при каких условиях не должен существовать некий базовый сервис (IDataService), откуда будут доступны любые данные приложения — сервисы доступа к данным ни при каких обстоятельствах не должны уметь сохранять изменения в данных, для этого должен быть отдельный сервис, IUnitOfWork — слой данных не должен ничего знать о способе хранения данных, однако предоставляет интерфейсы доступа к данным, с которым слой данных работать в состоянии — слой доступа к данным реализует интферфейсы слоя данных, касательно самого доступа, и не более того — вся остастка, провайдеры, менеджеры, и прочие нужные классы уходят в Infrastructure, очищая содержание основного проекта до минимума — Unit тесты!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.06.2013, 14:21 |
|
||
|
|

start [/forum/topic.php?fid=18&fpage=97&tid=1358286]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
28ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
80ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 360ms |

| 0 / 0 |
