Windows Mobile开发 - 从哪里开始?

时间:2008-12-18 11:39:37

标签: wcf architecture windows-mobile mobile

好的,我将很快开始Windows移动开发的道路。我对这个主题一无所知,我正在寻找有经验的人告诉我你可能知道的任何gottchas。

现在我甚至没有对所要求的内容有所了解,但假设应用程序将只是一堆用于更新数据的CRUD表单。我所知道的唯一其他要求是,当没有信号可用时,应用程序需要支持离线存储。反过来,显然需要在信号返回时进行某种同步。

我最初的想法是,应用程序将主要是与Web服务层交互的前端。我假设WCF将是构建这些服务的适当技术?我还认为SQL Server CE是关于离线存储问题的一个很好的途径。

您认为在此领域内有用的任何知识都将受到赞赏。建议,链接,书籍任何赞赏。

编辑:已经注意到离线同步有两种方法。要么使用某种形式的消息队列,要么使用SQL同步工具。谁能提供一个很好的比较和介绍这些?

编辑2:经过多一点挖掘后,我得到的印象是我可以在这里使用基本上3种不同的方法:

  1. Emmbeded数据库,以便在线查询当时的同步,
  2. MSMQ以及.NET远程处理
  3. 使用Exchange Server进行ExchangeWebServiceMailTransport绑定的WCF。
  4. 现在,第一个问题提出了一些不错的观点,我认为我在某种程度上理解了我将面临的问题。但我想获得有关MSMQ实现和使用WCF新绑定的更多信息。

16 个答案:

答案 0 :(得分:16)

根据我迄今为止(约9个月).net Windows Mobile开发的经验,这里有几句话。

  1. 嗯,你偶尔会有联系。 (或者更有可能偶尔断开连接)。您必须选择是否要使用队列消息(即WCF / SOAP / XML或类似的东西)或数据库同步。我选择SQL同步路由,所以我不能真正评论消息。 SQL同步路由没有麻烦!

  2. 如果你像我一样使用SQL compact进行同步路由,你基本上有两个选择。 SQL Server合并复制或较新的ADO.NET同步服务。如果选择前者,则需要非常小心数据库设计,以确保可以轻松地在移动订阅者和发布者之间进行分区。您真的需要考虑冲突,并且拆分通常不会在规范化数据库设计中拆分的表是这样做的一种方法。您必须考虑设备脱机一段时间并且发布者DB(即主DB)和/或订户更改相同数据的情况。设备重新上线后会发生什么?它可能意味着解决冲突,即使你已经很好地划分了事情。这是我被烧的地方。但SQL合并复制可以很好地工作,并减少您必须编写的代码量。

  3. 滚动你自己的DAL。不要尝试直接从UI代码使用数据引导器等,也不要使用类型化数据集。可能有第三方DAL与Windows Mobile一起使用(即我知道LLBLGEN可能值得一看)但不支持Linq-to-SQL,无论如何你需要轻量级的东西。 DAL的可能性不会太大,所以请自行动手。

  4. 如果你使用.net,你可能最终会想要一些未实现的平台功能。我建议使用这个廉价的框架来为您提供遗漏的内容(尤其是与连接和电源管理相关的内容) - http://www.opennetcf.com/Products/SmartDeviceFramework/tabid/65/Default.aspx

  5. Windows Mobile设备在不使用时会部分关闭以节省电量。如果您正在进行轮询类型设计,则需要每隔x分钟将其唤醒一次。普通的.net计时器类不会这样做。您需要使用可以从OpenNetCF(上面)使用的平台功能。 timer类叫做LargeIntervalTimer,位于OpenNetCF.WindowsCE程序集/名称空间中(我认为)。

  6. 祝你好运!

答案 1 :(得分:8)

SqlCE只是一个可用于Windows Mobile设备上本地数据存储的选项,虽然它是一个优秀的数据库但它有局限性。首先, SqlCE将无法在加密下工作(句点)(换句话说,如果您的用户加密SDF文件的位置,您将无法再访问数据)。 / p>

SqlCE的第二个(也是最关键的)弱点在于RDA / Merge Replication工具。在复制期间网络连接可能丢失的情况下, SqlCE合并复制不是100%可靠(在Windows Mobile设备中显然很常见)。如果您喜欢尝试向客户解释丢失或损坏的数据,请继续使用SqlCE并合并复制。

Oracle Lite是SqlCE的一个很好的替代品,尽管它在加密下也无法正常工作。如果加密是一个潜在的问题,您需要找到一个在加密下工作的数据库引擎(我不知道一个),或者使用XML或其他东西编写自己的持久性组件。

将WM应用程序编写为主要与Web服务实时交互的前端只能在始终连接的环境中工作。更好的方法是将应用程序编写为主要与本地数据(SqlCE,Oracle Lite,XML或其他)交互的前端,然后创建一个单独的同步组件来处理推送和提取数据。

同样,SqlCE合并复制实现了这种推送和拉动的优美和优雅 - 它只是不能一直工作。如果您希望复制机制可靠地运行,则必须编写自己的复制机制。 Oracle Lite有一个称为快照表的东西,它可以很好地用于此目的。 Olite中的快照表跟踪更改(如添加,更新和删除),并允许您单独查询更改并更新中央数据库(通过Web服务)以匹配。

答案 2 :(得分:6)

这几天前的thread I just posted已经证明对我来说是一个很好的资源。

此外,Windows Mobile MSDN WebCasts提供了从入门到高级开发等所有内容的丰富信息。

答案 3 :(得分:5)

我建议使用Sqlite进行本地存储。从我上次运行的基准测试开始,它比SqlCe要好得多,你不需要做愚蠢的事情,比如保留一个开放的连接以提高性能。

权衡是工具集不那么丰富,与其他MSSql产品的集成是零。 :(

答案 4 :(得分:4)

答案 5 :(得分:2)

您不应该为Windows移动开发而感到害怕。它与桌面开发没有太大区别。我强烈建议您使用.NET Compact Framework进行开发而不是C ++ / MFC。

一些有用的链接:

  • Mobile section代码 项目。你会发现很多 文章,需要一点点挖掘 找到合适的人。
  • 智能 来自OpenNetCF的设备框架 提供有价值的扩展 紧凑的框架。
  • 安装时 移动SDK,您将在下面找到 社区文件夹链接 Windows Mobile和CF框架 博客。这些也很有价值 资源。

关于您的应用程序,您对WCF和SQL Server CE是正确的。这些是处理通信和存储的正确方法。

来自桌面世界的人的一些提示:

  • 您需要进行某种电源管理。设备可以自动进入暂停状态。此外,您不必在不必要时消耗电力。
  • 网络连接是一个难题。您可以注册特定网络(Wi-Fi,GPRS)何时可用或不可用的通知。您还可以设置首选的沟通方式。
  • 使UI尽可能简单。用户使用他的拇指和/或笔,他可能正在移动。
  • 尽早在真实设备中进行测试。

答案 6 :(得分:2)

来自Windows Mobile团队博客的“24 Hours of Windows Mobile Application Development”有一些很好的资源

答案 7 :(得分:1)

如果可以的话,尝试从用户用例开始,然后回到代码,而不是反过来。与处理业务问题相比,在工具上花费更多时间真的很容易。并且考虑用户需求将帮助您考虑替代策略,因为您从普通.NET中了解的许多模式都不适用。

我已经完成了许多与您描述的类型完全间歇性的应用程序开发,并且板载数据库工作得很好。 MSMQ / WCF只会增加概念开销而不会增加太多价值。无论如何,您还需要本地逻辑数据存储,并且此级别的复制是一个简单的概念,您希望保持简单,因此可以轻松监视和调试审计跟踪。 MSMQ和WCF倾向于隐藏在不熟悉的地方。

我赞成了SqlLite建议BTW。对于CE来说,MS没有稳定的故事。

答案 8 :(得分:1)

对于数据库复制位,我强烈推荐Sybase Ultralite。在灵活性和性能方面,它打破了SQL CE

答案 9 :(得分:0)

我必须这样做一次。使用Mac进行开发的奇怪设置,我们都是Java程序员。并且截止日期很短。 PowerPC mac也是如此,所以没有机会安装Windows进行Visual Studio开发,不要因为这笔费用永远不会出现。

我们最终使用Java编写应用程序,在IBM J9虚拟机上运行,​​使用SWT作为用户界面。完全免费的开发堆栈。易于部署。代码在我们想要的任何平台上运行,而不仅仅是PocketPC / WinMob。

无论如何,大部分工作都在服务器端 - 数据库,即Web服务服务器。逻辑。报告引擎。然而,客户端并不是完全简单 - 从服务器获取表单模板(因为它们经常更改),站点详细信息(多站点部署),从表单模板生成UI(使用一些SWT GUI组件PocketPC开发很棒,比如ExpandBar),通过点击界面收集数据(尽可能减少键盘输入),然后将其提交回服务器。

对于离线存储,我们在设备上使用了XML文件。绰绰有余我们的需求,但你的可能会有所不同。也许考虑SQLite?

答案 10 :(得分:0)

您可以查看以下几个链接:

  1. http://developer.windowsmobile.com
  2. http://msdn.microsoft.com/en-us/windowsmobile/default.aspx
  3. 如果您在开发过程中遇到问题,那么您也可以参加MSDN上的Windows Mobile专用聊天,并提出您的问题。日历尚未更新,但下一个应该是1月份。您可以在此处找到时间表:http://msdn.microsoft.com/en-us/chats/default.aspx

答案 11 :(得分:0)

我将在这篇文章中添加一个额外的问题,因为它已经足够活跃,希望对我和其他人都有帮助。好的,所以在玩完之后我现在意识到标准类库不能包含在windows移动应用程序中。

现在压倒性的建议似乎是使用嵌入式数据库,虽然我现在有用例,看来我需要文档同步以及关系数据。考虑到这一点,服务层交互似乎是不可避免的。所以我的问题是如何在图层之间共享公共域对象和接口?

答案 12 :(得分:0)

“文档同步” - 这是否意味着双向?还是累积只写?我可以想到主要收集和提交共享文档交易的移动架构 - 如果这是您的要求,那么我们应该离线讨论 - 这是一个漫长(和有趣)的对话。

答案 13 :(得分:0)

Owen您可以从Compact Framework共享代码 - >桌面,它只是桌面 - >如果您使用CF不支持的某些对象,则Compact Framework会出现兼容性问题。

虽然桌面库不能在CF上运行,但是CF lib可以在桌面上运行,你也可以在桌面上运行CF.exes!

只需创建一个CF库作为定义基础对象/接口等的项目。

答案 14 :(得分:0)

本书应该是所有Windows Mobile开发人员的必读内容:http://www.microsoft.com/learning/en/us/books/10294.aspx

答案 15 :(得分:0)

开发windows mobile applications时,必须使用Silverlight,visual studio,windows phone emulator和sqlite等基本工具作为数据库存储。