Архитектура для приложений WinForms? - PullRequest
12 голосов
/ 25 августа 2009

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

Короче говоря: я только начал новый проект, в котором я хочу использовать лучший подход. Я просто не знаю, какой из них будет «хорошим». В ASP.net MVC я нашел шаблон MVVM действительно полезным, но на рабочем столе MVVM, кажется, предназначен только для WPF, а не для WinForms.

Другой подход - это трехуровневая архитектура: у меня есть мой Database-Class, который в настоящее время напрямую взаимодействует с пользовательским интерфейсом. Теперь я создаю новый статический класс («ApplicationState»), который обращается к базе данных и запускает события, чтобы сообщить пользовательскому интерфейсу «Эй, что-то изменилось!». Пользовательский интерфейс будет управлять состоянием, которое затем будет обрабатывать постоянство базы данных и снова вызывать события, если пользовательский интерфейс нуждается в обновлении. Дело в том, что класс ApplicationState никогда не изменяет интерфейс напрямую, а подписывается на события. Это выглядит как чистый / "MVC-й" способ сделать это, но, может быть, я здесь что-то упускаю?

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

Ответы [ 7 ]

9 голосов
/ 25 августа 2009

Не добавляйте полотенце на MVVM - это справедливо и для WinForms. По сути, если вы используете привязку данных, вы должны принять решение о том, с чем будут связаны ваши объекты. Зачастую, особенно для более сложного пользовательского интерфейса, вы не хотите связывать напрямую с вашими доменными объектами, вы хотите создавать специализированные классы (иногда обертки), с которыми может связываться ваш пользовательский интерфейс, которые предоставляют все, что нужно представлениям (суть MVVM) и метод работает так же хорошо с Winforms.

Хорошую серию по подходу WinForms Model-View-Presenter можно найти на

Оглавление серии CAB "Создай свой собственный"

6 голосов
/ 18 октября 2010

Документация NDepend поставляется с довольно интересными и продвинутыми публикациями в блогах, статьями и техническими документами, посвященными архитектуре кода .NET.

Советы по разбиению кода через сборки .NET

Зависимости компонентов управления для получения чистой архитектуры

Рефакторинг, реструктуризация и стоимость выравнивания

Эволюционный дизайн и ациклическая компонентизация

Расслоение, метрика уровня и дискурс метода

Боевая сфабрикованная сложность

Кроме того, если вы хотите постоянно проверять, что ваш код пользовательского интерфейса не зависит от кода вашей базы данных, вы можете легко написать некоторые правила языка кода запросов, которые будут проверяться во время разработки в Visual Studio:

Держите структуру кода в чистоте

5 голосов
/ 25 августа 2009

То, что я всегда хотел бы (во-первых), это иметь многоуровневое приложение

  • Уровень представления (JUST UI и логика привязки данных)
  • Интерфейсный уровень к бизнес-уровню (определение контрактов для доступа к BL)
  • Реализация бизнес-уровня (фактическая логика, проверка данных и т. Д.)
  • Уровень интерфейса с уровнем доступа к данным (определение контрактов для доступа к DAL)
  • Реализация уровня доступа к данным

Это очень хорошо организует ваше приложение. Тогда я бы искал подход MVC. Я не так много разрабатывал с WinForms, больше с Asp.net и некоторыми клиентами Java Desktop (где я использовал MVC ). WinForms больше работает с подходом привязки данных .Net (DataSource, DataMember, ...). Вы должны пойти на такой подход, а не пытаться заставить что-то другое. Я обнаружил, что это не очень хорошо.

Что всегда полезно, так это размещать нашу логику пользовательского интерфейса в различных элементах управления (например, UserControls в Asp.net). Это облегчает повторное использование.

1 голос
/ 29 ноября 2013

Нидо рамки это хорошо. Однако это только для вашей серверной архитектуры. Это даст вам твердый, гибкий и простой бэкэнд с t4template. У него очень хороший архитектурный рисунок. Более того, он может подключаться не только к WinForm, но и к любому другому интерфейсу (MVC ASP.NET и т. Д.).

Потом опять RocketFramework тоже хорошо

Ссылка 1: http://rocketframework.codeplex.com Ссылка 2: http://nidoframework.codeplex.com

1 голос
/ 25 августа 2009

Просто начните писать юнит-тесты для всего, что только можно придумать. Поскольку некоторые фрагменты будут трудно тестировать из-за сильной связи с WinForms, выделите их. Clean. Стирка. Повтор.

0 голосов
/ 22 апреля 2018

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

Надеюсь, этот ответ полезен.

0 голосов
/ 08 сентября 2009

Наше эмпирическое правило заключается в том, чтобы склоняться к MVC для большинства веб-сайтов из-за характера Интернета, не имеющего состояния. Если вы не пытаетесь обеспечить очень богатый опыт работы в Интернете и использовать Silverlight, то вам следует использовать MVVM. XAML идет рука об руку с MVVM и также может быть вашим умным клиентом (или хорошим шаблоном MVCP).

Истинный MVC практически невозможно поддерживать в любых других обстоятельствах из-за того, что контроллеры должны обрабатывать все входные данные. Большинство не веб-архитектуры имеют элементы управления, которые обеспечат это для вас. На самом деле, большинство говорят, что ASP.NET MVC в любом случае является гибридом MVC, но в моем опыте это очень хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...