博客园客户端(Universal App)开发随笔 - UAP中的项目和目录组织

前言

本篇随笔主要是分享一下做一个Universal App的目录组织结构,说明什么样的结构才能适合一个团队开发,使开发成员之间的相互影响最小。这些组织好的项目和目录会成为一个公共的规约,大家都能知道什么东西应该放在哪里,或者在什么地方能找到什么功能。这对于避免重复写code或者最大限度地复用code来说是至关重要的。

这种工程结构和目录划分虽然没有什么理论基础,但是是经过我们很多项目的经验总结出来的,如果是个人开发者,也严重建议参考此组织结构,能够帮助你理清思路,做好功能设计和类设计。

项目组织

开发一个Universal App, 如果前篇所说,基本框架在VS里有了(对不起我这里不小心装了个英文版),先选Universal Apps,再选Blank App,再把App1改成CNBlogs,就可以猛击OK了。

它缺省会帮你建立三个projects:CNBlogs.Windows(Windows 8.1)和CNBlogs.WindowsPhone(Windows Phone 8.1)。还有一个特殊的CNBLogs.Shared,扩展名为.shproj,是被上面两个project共用的。

如果做一个简单的UAP,这三个project就足够了。但是如果涉及到团队开发的较大的项目,还要有其它一些辅助的Project和其下面的一系列Folders才能够应付。如下图所示:

我们建立了以下辅助project:

1)BackgroundTask

2)DataHelper

3)NotificatoinsExtensions

说明如下:

1)BackgroundTask主要完成的任务是后台更新动态磁贴。这个以后我们说到Windows/Phone的后台任务时,会专门解释。

2)DataHelper,里面有两个folder,一个CloudAPI,里面针对每一个DataSource(API接口)都有个一个单独的类来处理,还可以根据各个DataSource的相似度,来抽象更底层的类。另一个是DataModel,就是数据模型类。这个DataHelper我们后续的CloudAPI篇里会仔细说。

3) NotificatoinsExtensions 这个其实不是我们自己写的,是直接从MSDN里的sample里下载的(按照微软的建议,但不明白为什么不做成一个库,而是以源代码形式给出)。这个项目里主要给出了一些帮助方法,来简单地更新磁贴,否则就要直接操作XML数据来更新磁贴,非常容易出错,而且不容易理解。这个以后讲动态磁贴时才细说。

在这个有个问题:为什么DataHelper project不放在Shared里面呢?原因特简单:因为BackgroundTask也需要访问DataHelper, 如果放在Shared里面访问不到,因为Shared只为Windows/WindowsPhone两个Project服务。(如果这里我的理解有什么错误请大虾们指正)

目录组织

我们着重说一下Windows, WindowsPhone, Shared三个Project中的文件夹。

CNBlogs.Windows(Windows 8.1)

1)Assets

里面装着那些图像文件,一般有三类:A) Tile类,只为磁贴而做;B) Image类,只为背景图,装饰图之类的而做;C)Icon类,放在AppBar中的图标。如果项目较大,图像文件较多时,可以在这个文件夹下建立三个子文件夹,分别为Tile, Image, Icon。

2)Common

这个是系统自带的。如果系统没有生成这个文件夹,你在添加一个新的Page时,指定BasicPage,就可以生成它。这个文件夹里有个4个文件,包括了很多帮助函数,供处理Navigation时是使用。轻易不动它。

3)Controls

这里放着你的小宝贝们,就是那些Template Control,或者User Control。如果是Template Control, 这里面只放一个XXXControl.cs; 如果是User Control, 这里面放一个XXXControl.xaml, 下面附带了XXXControl.xaml.cs。关于这两种Control的区别,我们后续有专门的一篇博客讲解。

5)Pages

这里面放着你的大宝贝们,就是那些页面啦。每个页面都有个单独的XAML和其下面附带的.cs文件来描述其样式和行为,以及和其他页面的交互关系。

6)SettingFlyouts

Windows中的设置页面比较特殊,在右面,是一种规约,鼠标右键或者轻扫右侧边框弹出5个系统按钮,按下面的“设置”即可进入某个App自己的设置页面。这些设置页面其实也是用XAML来表现的。

7)Themes

这里放的是Template Control的样式,只有一个Generic.xml,里面放了所有自定义Template Control的样式(User Control不在这里)。不需要把它挪出来放在别的什么地方,别有洁癖,谁知道移到别的地方会出什么错误。

Folder就这些了,各有各的用处,有的是系统建的,有的是你自己建的,目的只有一个,让自己和别人可以很快地找到东西。

有一个地方要注意,就是namespace。如果你在Project上右键添加一个Page, namespace是CNBlogs; 如果在Pages上添加,namespace是CNBLogs.Pages。都可以,但是要统一,否则要出麻烦。

CNBlogs.WindowsPhone(Windows Phone 8.1)

Windows Phone的Folder们和Windows的基本一样,只是最下面的Pages和Views的区别,这个只是习惯问题,您随便。

CNBLogs.Shared

Shared Project有些不一样了,我们细细说来。

1)Assets

如果Windows/Phone有相同的图像资源(样子/颜色/尺寸都相同),可以只放一份在这里。但是目前Windows/Phone的Tile有尺寸上区别,所以Tile部分要分开放。背景图之类的肯定也不一样,一大一小。ICON部分可能会一致,因为Windows和Phone下面的AppBar中AppBarButton大小一样。

2)ControlHelper

这里面一般放置两类cs文件,一类是TemplateSelector,另一类是Converter,就是数据转换类。这个我们在后面的博客中专门讲(记得提醒我,我已经承诺不少东西了)。这两类东西,对于Windows/Phone来说是共用的。

3)FunctionHelper

顾名思义,放的是你自己的通用的帮助函数类。

4)HTML

可有可无,看项目。如果项目中有用到WebView的,也许需要一些初始的HTML或者css。

5)SampleData

对于大多数应用来说,都需要data支持,有的是用本地data,有的用远程data。当data没有到位时(CloudAPI部分还没有完工),你可以先手工制作一些模拟data放这里,不影响开发进度。

6)Strings

这里面放的是Resources, 按国家/市场划分。比如我们只有一个zh-CN子目录,也许还有个ja-JP子目录,里面放着Resources.resw。这个样子的:

所有界面上用到的字符串都扔里面,比如在zh-CN中有个”Title \t 首页”,在en-US中必须有个”Title \t Home“来对应,以便在不同国家显示不同语言。

7)App.xaml和StyleDictionary.xaml

共用的,放这里没事儿。尤其是StyleDictionary.xaml,里面放着所有的颜色,字体,样式等信息,你在Windows上的应用使用蓝底白字,在Windows Phone上要统一用蓝底白字,就靠使用这个文件里的信息了。

小结

在本篇随笔中,我们强调了CloudAPI的重要性,是因为我们从很多成功的App中总结出云端数据和服务支持的重要性; 而削弱了MVVM的重要性,是因为我们从实践中体会到,Model和View都是不可或缺的,但是ViewModel就不是那么重要了,代码重复,可读性差,能替代它的方法很多。至于什么可自动测试性,根本谈不上。开发测试一体,有助于节约成本,提高工作效率,增强开发人员的责任心。

你可以从这里下载我们分享的源代码:

https://code.msdn.microsoft.com/CNBlogs-Client-Universal-9c9692d1

当然更可以直接下载两个App来看效果,但是由于designer介入较晚,所以UI上面还需要完善,我们会持续更新App。

Windows Phone Store App link:

http://www.windowsphone.com/zh-cn/store/app/博客园-uap/500f08f0-5be8-4723-aff9-a397beee52fc

Windows Store App link:

http://apps.microsoft.com/windows/zh-cn/app/c76b99a0-9abd-4a4e-86f0-b29bfcc51059

纯粹干净的App, 里面绝无广告,请放心使用。

分享代码,改变世界!

时间: 2024-10-06 12:48:52

博客园客户端(Universal App)开发随笔 - UAP中的项目和目录组织的相关文章

博客园客户端(Universal App)开发随笔 – UAP 项目的发布

在费尽无数脑细胞开发出一款 App 并且通过测试,自我感觉良好的时候,我们一定希望我们的 App 能够尽快出现在商店的首页上,被人下载,使用,打分,评价,反馈,甚至是被无情地喷.但据本人经验,通常从项目打包好(打包的具体注意事项,请参见前文),到通过审核,其他用户在商店可以看到,往往都像新手第一次编译程序一样,一波三折,弹出不同的错误和警告,这个时候,只有耐下性子,一个一个问题都解决了,才能顺利通过审核.所以我觉得还是很有必要写点什么,讲一下 App 发布时的注意事项,省得大家多走弯路. 虽说开

博客园客户端(Universal App)开发随笔 – App也需要物流前的打包

想起来一个笑话:唐僧一行千辛万苦来到佛祖面前,准备取经,佛祖轻声问了一句:汝等带U盘了吗?师徒4人立刻昏倒在地.好吧,扯远了,不过是想告诉大家准备工作一定要到位. Universal App 的打包发布其实与传统的 Windows Phone / Windows Store App 项目并无太大不同,但是鉴于总有人会在这些步骤中遇到问题,而且即使是发布过几个应用的开发者也不例外,所以对这个看起来比较繁琐的过程做一个小结还是必要的. 打包前的准备工作 1. 修改编译模式 在调试程序时,我们通常会选

博客园客户端(Universal App)开发随笔 - Setting Page的实现方法与经验

前言 几乎所有的移动 App 都会为用户提供一个设置页面(Setting Page 或 Preference Page),来满足大家对于一个 App 众口难调的需求.虽然有一种说法表示,最好的 App 不需要设置,一切默认呈现给用户的就是最好的选择.但是对于大多数开发人员来说,这样的境界不是可以简单达到的:而且对于部分“设置控”用户来说,没有设置页面怎么看都觉得少了些什么.所以对于大部分 App 来说,设置页面还是一个必备品. 本文将分别介绍 Windows 和 Windows Phone 的设

博客园客户端(Universal App)开发随笔 -- 样式管理与夜间模式

以今天的眼光来看,一个好应用首先是要有好的用户体验.而好的用户体验最直观的就来自于用户界面.好的用户界面则需要好的设计,更需要好的实现.今天我们就向大家分享一下我们在使用Xaml实现界面设计上的一点心得. 样式管理 我们拿到的设计,大多是一张红线图,布满了距离,字号,色号,事无巨细的量化了我们的用户界面.如果我们就这样把各种属性照搬到上Xaml文件中,那看起来就非常不妙了,比如这样: <TextBlock Text="首页"FontFamily =" Segoe WP

博客园客户端(Universal App)开发随笔 - 应用漫游数据(roaming)

当用户在多个windows设备上使用应用时,我们希望用户的某些设置和数据可以在多个之间共享,比如我们新版本中收藏的文章.通常情况下要实现这种功能,我们可能需要自己弄个服务器或者使用onedrive等网站来存放文件,但是对于我们这种小型的应用有点过了,额外增加了代码和维护的工作.这种时候使用windows roaming就是一个比较方便的选择. 所谓的漫游数据,MSDN上是这样介绍的: Windows 8 可在用户设备之间自动传输某些应用数据.应用开发人员无需再执行费力的工作.漫游应用数据为最终用

博客园客户端(Universal App)开发随笔 -- 数据基础准备

在开始之前,我们先了解下博客园提供的接口: 博客: http://wcf.open.cnblogs.com/blog/help新闻: http://wcf.open.cnblogs.com/news/help 以博客园_48小时阅读排行为例,返回的Xml如下图(RSS,如果你用IE打开的话,会提示你订阅..). 博客园的大部分API返回的都是RSS(还提供分页!),如果只是做一个简单的RSS reader,可以直接用SyndicationClient,在RetrieveFeedAsync后会把X

博客园客户端(Universal App)开发随笔 -- App的精灵:自定义控件

前言 拿到一个App的需求后,对于前端工程师来说,第一步要干什么?做Navigation规划!第二步要干什么?做页面分解!页面分解如何做?首先要确定UI Element的容器,其次要抽象UI Element本身,也就是要做一堆自定义控件,最终组成整个页面.今天我们就说说自定义控件如何实现吧. 感性认识 在我们的博客园UAP的Windows Phone的版本中,一个最重要的自定义控件就是PostControl,它的样子如下图中红色矩形内所示. 这个控件在无数页面中都要用到,而且有几种变种.上面看到

博客园客户端(Universal App)开发随笔 -- 增量加载 (incremental loading)

在我们的应用(博客园UAP)中,加入了ListView上拉获取更多内容的功能(GridView也可以),这个功能是通过ISupportIncrementalLoading接口实现的,这是个从Windows 8就开始提供的接口(当然你可以通过ScrollViewer来实现这个功能,只不过稍微麻烦点,还要自己再封装..). 这个接口的定义十分简单: public interface ISupportIncrementalLoading { bool HasMoreItems { get; } IAs

博客园客户端(Universal App)开发随笔 - Hello, Universal

在移动和云成为微软的主题之后,Windows Phone 8.1 手机和Windows 8.1平板也渐渐成熟,吸引了越来越多的开发者.为了让开发者们高效的开发一款跨手机和平板的应用,微软顺势推出了Universal应用的概念. 今天我们想向大家分享怎样用C#和XAML语言开始开发一个跨Windows 8.1和 Windows Phone 8.1 的 Universal 应用. 准备 首先硬件方面我们的计算机要支持Hyper-V功能或者有一部运行Windows Phone 8.1 操作系统的手机.