Как бы вы спроектировали настольное приложение на C# 3.0?

StackOverflow https://stackoverflow.com/questions/45705

  •  09-06-2019
  •  | 
  •  

Вопрос

Я создал простое настольное приложение на C# 3.0, чтобы немного изучить C#, wpf и .Net 3.5.Мое приложение по существу считывает данные из файла CSV и сохраняет их в базе данных SQL-сервера CE.Я использую sqlmetal для генерации кода ORM для базы данных.Моя первая версия этого приложения чертовски уродлива, и я сейчас занимаюсь ее рефакторингом.

Это подводит меня к моему вопросу.Как бы вы спроектировали настольное приложение базы данных на C#?Каковы лучшие практики?

Создаете ли вы уровень абстракции базы данных (DAL), который использует код, сгенерированный sqlmetal?Или сгенерированный код является достаточно абстракцией?

Если вы используете шаблон DAL, вы делаете его одноэлементным или статическим членом?Используете ли вы шаблон View-Model-ModelView с шаблоном DAL?

Извиняюсь, если это кажется длинным открытым вопросом, но в последнее время я много об этом думал.Я вижу много примеров разработки корпоративного многоуровневого приложения на C#, но не так уж много примеров разработки автономных настольных приложений.

Это было полезно?

Решение

Я бы начал с Руководство по составному приложению для WPF (кашель ПРИЗМА кашель) от команды Microsoft P&P.Вместе с загрузкой поставляется отличное эталонное приложение, которое является отправной точкой для большей части моей сегодняшней разработки WPF.

А Команда DotNetRocks только что взял интервью Гленн Блок и Брайан Нойес об этом, если вам интересно услышать от них больше.

Более того, Prism далеко не так тяжел, как CAB, если вы вообще знакомы с ним со времен WinForms.

Другие советы

Ответ, как всегда, «это зависит».

Несколько вещей, о которых стоит подумать:В какой-то момент вы можете захотеть сделать это толстое клиентское приложение веб-приложением (например).В этом случае вам следует обязательно сохранить разделение между бизнес-уровнем (и ниже) и презентацией.Самый простой способ сделать это — убедиться, что все вызовы бизнес-логики проходят через какой-либо интерфейс.Более сложный способ — реализовать полную настройку MVC.

Еще одна вещь, которую вы можете рассмотреть, — это сделать уровень доступа к данным независимым от бизнес-логики и пользовательского интерфейса.Под этим я подразумеваю, что все вызовы бизнес-логики в DAL должны быть общими: «получите мне эти данные», а не «получите мне эти данные из SQL» или, что еще хуже, «запустите этот оператор SQL».Таким образом, вы можете заменить свой DAL на тот, который обращается к другой базе данных, файлам XML или даже к чему-то неприятному, например к плоским файлам.

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

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

Что касается полезных учебных ресурсов, я настоятельно рекомендую вам взглянуть на КомпозитWPF это проект, разработанный специально для обучения разработчиков передовому опыту разработки настольных приложений.

Я бы начал с Джереми Миллера Создайте свою собственную кабину ряд.

Я был одним из первых, кто внедрил CAB.Я многому научился, изучая эту технологию и читая все блоги .NET об архитектуре приложений.

Но недавно у меня появилась возможность начать новый проект, и вместо использования CAB я выбрал StructureMap & NHibernate и позаимствовал некоторые шаблоны, которые использует Джереми (в частности, его способ обработки агрегации событий).В результате получился действительно упрощенный, созданный вручную фреймворк, который делает все, что мне нужно, и мне нравится с ним работать.

Что касается конкретики вашего вопроса:Я использую репозиторий для доступа к данным.Сначала я написал код ADO.NET, использовал устройства чтения данных и сопоставил свои объекты.Но это очень быстро надоело, поэтому я взял NHibernate и был очень доволен.Репозитории используют NHibernate для доступа к данным, и мои потребности в доступе к данным в этом конкретном приложении довольно просты.

У меня есть уровень обслуживания (доступный через WCF, дуплексные каналы), который использует репозитории.Мое приложение по сути является клиент-серверным с обновлением в реальном времени (и я знаю, что ваш вопрос был только о клиентах, но я бы использовал те же технологии и шаблоны).О

На стороне клиента я использую MVP со StructureMap для IoC и несколько очень простых стратегий агрегации событий для межклассовой связи.Я кодирую интерфейсы практически для всего.Единственное, что я сделал, это позаимствовал у CAB идею гибкого «Рабочего пространства» для динамического отображения представлений.Однако я написал свой собственный интерфейс Workspace и реализовал свои собственные DeckWorkspace и TableWorkspace для использования в своем приложении (это было действительно просто написать).

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

Я бы сказал, да, его можно легко структурировать для более мелких приложений.Чтобы начать работу, нужно пройти обучение, но, честно говоря, это помогло мне лучше понять WPF, чем попытки начать с нуля.После запуска проекта с CompositeWPF, а затем запуска другого проекта без него, я обнаружил, что пытаюсь дублировать функции CompositeWPF самостоятельно, потому что мне эти функции не хватало!:)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top