Хорошо, скоро я начну разработку мобильных приложений для Windows. На самом деле я ничего не знаю об этом предмете, и я ищу людей с опытом, которые сообщат мне о любых неприятностях, о которых вы можете знать.
Прямо сейчас я даже не знаю, что требуется, но предполагаю, что приложение будет немного больше, чем набор CRUD-форм для обновления данных. Единственное другое требование, которое у меня есть, это то, что приложение должно поддерживать автономное хранилище, когда нет доступного сигнала. Это, в свою очередь, очевидно, потребует какой-то синхронизации при возврате сигнала.
Мои первоначальные мысли заключаются в том, что приложение будет в первую очередь интерфейсом для взаимодействия со слоем веб-сервисов. Я предполагаю, что WCF будет подходящей технологией для создания этих сервисов? Я также подумал, что SQL Server CE будет хорошим способом решить проблемы с автономным хранилищем.
Любые знания, которые вы считаете полезными в этой области, будут оценены. Советы, ссылки, книги все по достоинству.
Обновлено: было отмечено, что есть два способа использовать автономную синхронизацию. Либо использовать какую-либо форму организации очереди сообщений, либо использовать инструменты синхронизации SQL. Может ли кто-нибудь предложить хорошее сравнение и введение в них?
РЕДАКТИРОВАТЬ 2.После того, как я немного покопался, у меня сложилось впечатление, что я могу использовать в основном 3 разных подхода:
Итак, по первому вопросу было поднято несколько замечательных моментов, и я думаю, что на каком-то уровне понимаю проблемы, с которыми мне придется столкнуться. Но я хотел бы получить немного больше информации о реализациях MSMQ и использовании новых привязок WCF.





вы можете сослаться на это:
Вы не должны бояться разработки для Windows Mobile. Это не сильно отличается от настольной разработки. Я настоятельно рекомендую вам использовать для разработки .NET Compact Framework, а не C++ / MFC.
Некоторые полезные ссылки:
Что касается вашего приложения, вы правы насчет WCF и SQL Server CE. Это правильные способы управления связью и хранением.
Несколько советов для людей, пришедших из мира настольных компьютеров:
Однажды мне пришлось это сделать. Странная установка с Mac для разработки, и все мы были программистами на Java. И сжатые сроки. PowerPC macs тоже, так что нет шансов установить Windows для разработки Visual Studio, не говоря уже о том, что денег на это никогда бы не появилось.
В итоге мы написали приложения, использующие Java, работающие на виртуальной машине IBM J9, с SWT для пользовательского интерфейса. Полностью бесплатный стек разработки. Легко развернуть. Код работал на любой платформе, которую мы хотели, а не только на PocketPC / WinMob.
В любом случае большая часть работы была на стороне сервера - базы данных, сервера веб-службы. Логика. Механизм отчетности. Однако клиентская сторона не была полностью простой - она могла получать шаблоны форм с сервера (потому что они часто менялись), детали сайта (многосайтовое развертывание), генерировать пользовательский интерфейс из шаблона формы (с использованием некоторых компонентов графического интерфейса SWT, которые замечательно для разработки PocketPC, например ExpandBar), собирайте данные с помощью интерфейса «наведи и щелкни» (минимизируя ввод с клавиатуры, где это возможно), а затем отправьте их обратно на сервер.
Для автономного хранения мы использовали XML-файлы на самом устройстве. Более чем достаточно для наших нужд, но ваше может отличаться. Может, рассмотрим SQLite?
Вот несколько слов из моего опыта (около 9 месяцев) разработки .net Windows Mobile.
Ну, иногда вы подключаетесь. (Или, что более вероятно, время от времени отключается). Вы должны выбрать, собираетесь ли вы использовать обмен сообщениями с очередями (например, WCF / SOAP / XML или что-то в этом роде) или синхронизацию базы данных. Я выбираю маршрут синхронизации SQL, поэтому не могу комментировать обмен сообщениями. Маршрут синхронизации SQL не беспроблемный!
Если вы пойдете по маршруту синхронизации с SQL compact, как я, у вас в основном есть два варианта. Репликация слиянием SQL Server или более новые службы синхронизации ADO.NET. Если вы выберете первое, вам нужно быть очень осторожным с дизайном своей БД, чтобы ее можно было легко разделить между мобильными подписчиками и издателем. Вам действительно нужно думать о конфликтах, и разделение таблиц, которые обычно не разделяются в нормализованном дизайне БД, является одним из способов сделать это. Вы должны учитывать ситуации, когда устройство отключается на некоторое время, а БД издателя (то есть основная БД) и / или подписчик изменяют одни и те же данные. Что произойдет, когда устройство вернется в режим онлайн? Это может означать разрешение конфликтов, даже если вы хорошо разбили все на разделы. Здесь я обгорел. Но репликация слиянием SQL может работать хорошо и сокращает объем кода, который вам нужно написать.
Сделайте свой собственный DAL. Не пытайтесь использовать носители данных и т. д. Непосредственно из кода пользовательского интерфейса, а также не используйте типизированные наборы данных. Могут быть сторонние DAL, которые работают с Windows Mobile (то есть я знаю, что LLBLGEN работает, возможно, стоит взглянуть), но Linq-to-SQL не поддерживается, и в любом случае вам нужно что-то легкое. Скорее всего, DAL не будет слишком большим, поэтому проверяйте его самостоятельно.
Если вы используете .net, вы, вероятно, захотите использовать некоторые нереализованные функции платформы. Я рекомендую использовать этот недорогой фреймворк, чтобы дать вам то, чего вам не хватает (особенно в отношении подключения и управления питанием) - http://www.opennetcf.com/Products/SmartDeviceFramework/tabid/65/Default.aspx
Устройства Windows Mobile частично отключаются для экономии энергии, когда они не используются. Если вы делаете дизайн типа опроса, вам нужно будить их каждые x минут. Обычный класс таймера .net этого не сделает. Вам нужно будет использовать функцию платформы, которую можно использовать из OpenNetCF (см. Выше). Класс таймера называется LargeIntervalTimer и находится в пространстве имен / сборки OpenNetCF.WindowsCE (я думаю).
Удачи!
Привет, Оуэн. Честно говоря, я не уверен в NHibernate на Windows Mobile. Я бы попробовал провести несколько тестов (или найти кого-нибудь еще, так?), Прежде чем идти по этому пути. SQLCE имеет легкие объекты DA, такие как SqlCeResultSet, и я сомневаюсь, что NHibernate будет их использовать.
NHibernate поддерживает SQL CE, меня это не беспокоило, просто вы упомянули, что DAL должен быть легковесным, и я не знаю, насколько легковесным вы имеете в виду. Не думайте, что NHibernate действительно тяжелый, но все же это фреймворк.
Для NHibernate есть SqlServerCeDriver, я этого не знал. Я бы попробовал или хотя бы посмотрел исходный код. Типизированные наборы данных SQL слишком тяжелые, очень медленные. Если SqlServerCeDriver использует скрытые объекты SQLCE DA, он может работать нормально.
Спасибо, Крис, очень помог. Мне просто нужно сравнение с подходом к очереди сообщений. Ура за это.
Я не уверен, что NHibernate будет хорошей идеей, так как он сильно отражается, хотя сам я его не пробовал.
Придирчиво - как и в случае с ny edit, я только что обнаружил, что стандартные сборки в любом случае нельзя добавлять в оконные мобильные приложения, поэтому я думаю, что NHibernate полностью исключен. Но что это за проблемы с отражением?
SqlCE - это только один из опций, доступных для локального хранения данных на устройстве Windows Mobile, и, хотя это отличная база данных, у нее есть ограничения. Во-первых, SqlCE не будет работать (точка) при шифровании (другими словами, если ваш пользователь зашифровывает место, где находится ваш файл SDF, вы больше не сможете получить доступ к данным).
Вторая (и самая важная) слабость SqlCE заключается в инструментах RDA / Merge Replication. Репликация слиянием SqlCE не на 100% надежна в ситуациях, когда сетевое соединение может разорваться во время репликации (что, очевидно, очень часто встречается на устройствах Windows Mobile). Если вам нравится объяснять клиентам недостающие или поврежденные данные, используйте SqlCE и репликацию слиянием.
Oracle Lite - хорошая альтернатива SqlCE, хотя он тоже не работает должным образом при шифровании. Если шифрование представляет собой потенциальную проблему, вам нужно найти механизм базы данных, который работает с шифрованием (я не знаю такого), или же написать свой собственный компонент постоянства, используя XML или что-то еще.
Написание WM-приложения в качестве внешнего интерфейса, которое в основном взаимодействует с веб-сервисом в реальном времени, будет работать только в среде с постоянным подключением. Лучший подход - написать свое приложение как интерфейс, который в основном взаимодействует с локальными данными (SqlCE, Oracle Lite, XML или что-то еще), а затем создать отдельный компонент синхронизации, который обрабатывает отправку и извлечение данных.
Опять же, репликация слиянием SqlCE делает все это красиво и элегантно - просто она не работает постоянно. Если вам нужен надежный механизм репликации, вам придется написать свой собственный. В Oracle Lite есть так называемая таблица моментальных снимков, которая очень хорошо подходит для этой цели. Таблица моментальных снимков в Olite отслеживает изменения (например, добавления, обновления и удаления) и позволяет запрашивать изменения отдельно и обновлять центральную базу данных (через веб-службу) для соответствия.
«веб-сервис в реальном времени будет работать только в среде с постоянным подключением» - я понимаю, но разве не для этого существуют такие вещи, как MSMQ? Разве использование встроенной базы данных и синхронизация таким образом не только 1 вариант?
P.S. Я действительно спрашиваю здесь, правда не знаю. Насколько я знаю, эти два решения могут быть каким-то образом смешаны.
MSMQ может иметь отношение к этой проблеме в среде, где КПК подключен большую часть времени (скажем, 99%), но время от времени случаются сбои. В такой ситуации вам вообще не понадобится база данных. В написанных мною WM-приложениях доступность сети больше похожа на ...
... 5-10%, поэтому наличие локальной базы данных имеет решающее значение. Важная цитата о MSMQ из MSDN: «Очередь сообщений не является базой данных и не обеспечивает функциональных возможностей базы данных».
Спасибо MusiGenesis, вы очень помогли +1
Без проблем. Хотелось бы, чтобы по SO было больше вопросов WM. :)
Эээ ... Базы данных SQLCE могут быть зашифрованы и работать на Windows Mobile. И какое-то время это удавалось. Хотя в 3.5 SP1 посильнее. Смотрите здесь - download.microsoft.com/download/f/7/2/…
Или, может быть, вы имеете в виду, что они не будут работать с SD-картами с файловым шифрованием или чем-то в этом роде ??
@ChrisE: Я имел в виду последнее, что они не будут работать с SD-картами с файловым шифрованием. Это может быть сюрпризом, если ваш клиент вдруг потребует шифрование файлов.
Этот тема, которую я только что опубликовал на SO несколько дней назад оказался для меня отличным ресурсом.
Также Веб-трансляции MSDN для Windows Mobile - это обширная информация обо всем, от начала работы до продвинутой разработки.
Я бы предложил Sqlite для локального хранилища. Судя по последнему тесту, который я запускал, он был намного лучше, чем SqlCe, и вам не нужно делать глупых вещей, таких как сохранение открытого соединения для повышения производительности.
Компромиссы заключаются в том, что набор инструментов менее богат, а интеграция с другими продуктами MSSql равна нулю. :(
Голосовать за - там тоже было.
Для начала есть пара ссылок:
Если в процессе разработки у вас возникнет проблема, на MSDN также есть специальные чаты для Windows Mobile, в которых вы можете посетить и задать свои вопросы. Календарь еще не обновлялся, но следующие должны быть в январе. Вы можете найти расписание здесь: http://msdn.microsoft.com/en-us/chats/default.aspx
Если можете, попробуйте начать с пользовательских сценариев использования и вернуться к коду, а не наоборот. Действительно легко потратить намного больше времени на работу с инструментами, чем на решение бизнес-задачи. А продумывание требований пользователей поможет вам рассмотреть альтернативные стратегии, потому что многие шаблоны, которые вы знаете из обычного .NET, неприменимы.
Я делал много периодических разработок приложений именно того типа, который вы описываете, и встроенная база данных работает отлично. Материал MSMQ / WCF просто добавляет концептуальные накладные расходы, не добавляя особой ценности. В любом случае вам необходимо локальное логическое хранилище данных, а репликация на этом уровне - это простая концепция, которую вы хотите сохранить простой, чтобы журнал аудита можно было легко отслеживать и отлаживать. MSMQ и WCF склонны прятать вещи в незнакомых местах.
Я поддержал предложение SqlLite, кстати. MS еще не стабилизировала свою историю настойчивости для CE.
Поддерживает ли sql lite SPROCS и представления, как кажется, CE нет. Также, какие варианты синхронизации доступны с sql lite, совместимым с SQL Server CE.
Я не знаю ваших требований, но для моих целей мне все равно не нужна общая слепая синхронизация, а скорее асинхронные обновляемые таблицы валидации и асинхронные таблицы очереди транзакций с повторными попытками по таймеру.
Да, он поддерживает представления (только для чтения). Никаких хранимых процедур, но я бы все равно реализовал класс DAL, чтобы делать такие вещи. Полная информация здесь - sqlite.org/docs.html
Я собираюсь добавить к этому посту дополнительный вопрос, так как он был достаточно активным и, надеюсь, будет полезен не только мне, но и другим. Итак, поигравшись, я понял, что стандартные библиотеки классов не могут быть включены в мобильные приложения Windows.
Теперь подавляющий совет здесь, кажется, заключается в использовании встроенной базы данных, хотя теперь у меня есть варианты использования, и, похоже, мне понадобится синхронизация документов, а также реляционные данные. С учетом этого взаимодействие на уровне обслуживания кажется неизбежным. Итак, мой вопрос: как мне использовать общие объекты домена и интерфейсы между слоями?
«Синхронизация документов» - двунаправленная? Или кумулятивная только для записи? Я могу думать о мобильных архитектурах, которые в основном будут собирать и отправлять транзакции для общего документа - если это ваше требование, тогда мы должны обсудить в автономном режиме - это долгий (и интересный) разговор.
Мои требования включают уровень двунаправленного общения.
Оуэн, вы можете поделиться кодом из Compact Framework -> Desktop, только Desktop -> Compact Framework имеет проблемы с совместимостью, если вы используете определенные объекты, которые не поддерживаются CF.
Хотя настольная библиотека не работает с CF, CF-библиотека БУДЕТ работать на рабочем столе, вы также можете запустить CF.exes на рабочем столе!
Просто создайте библиотеку CF как проект, который определяет ваши базовые объекты / интерфейсы и т. д.
Спасибо за то, что вздорный. Имеет смысл, что это было бы так.
"24 часа разработки приложений для Windows Mobile" из блога группы разработчиков Windows Mobile содержит полезные ресурсы.
Эту книгу следует прочитать всем разработчикам Windows Mobile: http://www.microsoft.com/learning/en/us/books/10294.aspx
Для бита репликации базы данных я настоятельно рекомендую Sybase Ultralite. С точки зрения гибкости и производительности он выбивает из колеи SQL CE.
Для разработки мобильные приложения Windows у вас должны быть базовые инструменты, такие как silverlight, visual studio, эмулятор Windows Phone и sqlite в качестве хранилища базы данных.
Спасибо, Крис, что касается прокрутки вашего собственного DAL - я так понимаю, NHibenate не рекомендуется, так как это был мой первоначальный маршрут.