购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 系统公共层设计

Silverlight.Photo.Browser.Server是整个解决方案项目中的公共层,在这个标准的ASP.NET类库项目中定义了一系列的实体类和操作类,以供ASP.NET Web应用程序进行调用,同时作为ASP.NET Web服务被公开给客户端Silverlight项目。

2.3.1 定义业务实体类

Silverlight.Photo.Browser.Server项目中定义了一系列的实体类,这些实体类将作为Web服务方法中的返回值供客户端Silverlight进行调用。这些实体类实现了INotifyPropertyChanged接口,该接口用来提供属性值的变更通知,在Siverlight应用程序中需要使用实现该接口的类来提供属性变更时的用户界面变更或者是绑定的功能。在项目中定义的4个实体类如图2.15所示。

img

图2.15 实体类结构图

可以看到这几个类都实现了INotifyPropertyChanged接口,这4个实体类的作用如下。

· ThumbnailInfo类:单个相册缩略图对象,每个对象附带了一个名为BaseColor的ColorInfo对象,用来提取照片的基色调信息。

· ColorInfo类:用来保存颜色信息的类,包含红、绿、蓝三原色和Alpha混合值。

· ImageSlotInfo类:用来保存相片ID信息。

· AlbumInfo类:保存相册信息。

由类图可以看到,ThumbnailInfo和AlbumInfo类都包含了canEdit属性,因为相册和缩略图允许用户编辑,比如可以输入图片的标题和描述性的消息,也可以禁止编辑,取决于当前相册是否处于编辑状态。

以ThumbnailInfo类为例,该类实现了INotifyPropertyChanged接口, INotifyPropertyChanged接口仅包含一个PropertyChanged事件的定义,在属性发生更改时,触发该事件来更新客户端界面,在本示例中是对Silverlight的客户端的属性变更。代码2.2列出了其中的定义代码,部分重复的属性定义为节省篇幅省略,请参考配套的代码。

代码2.2 ThumbnailInfo实体类定义

img

这个类与普通的.NET类比较相似,不同之处在于属性的setter设置器,每个属性在设置了值以后,都会调用OnPropertyChanged来触发属性变更通知。客户端框架通过获取这个通知来更新用户界面。

2.3.2 定义IPhotoBrowserService服务接口

IPhotoBrowserService定义了ASP.NET服务器端将提供的供客户端Silverlight使用的相册和相片管理服务,这些服务方法将被Web服务实现,用来提供相册管理服务,定义如代码2.3所示。

代码2.3 IPhotoBrowserService服务接口定义

img

IPhotoBrowserService接口定义了服务器端将要提供的相册管理相关的功能,在代码中,ImageSlot类是专门用来处理图片上传的类,对应的图片上传信息的实体类为ImageSlotInfo类。在介绍Web服务的具体实现时,会详细地介绍部分的服务实现过程,本小节读者只需要理解在IPhotoBrowserService中定义了Web服务需要实现的契约。

2.3.3 图片上传处理类ImageSlot

ImageSlot是处理图片上传的一个类,实际上它只是将图片数据转换为byte字节数据,然后使用一个回调函数将上传的数据插入到数据库中,下面按步骤来介绍该类的实现过程。

(1)在ImageSlot类中首先定义了一个回调委托StoreUploadedImageCallback,当图片调整到合适的尺寸后,就调用该委托关联的方法,将图片数据插入到数据库中,定义代码如下:

img

(2)ImageSlot的构造函数包含StoreUploadedImageCallback委托类型的参数,要求用户在实例化ImageSlot处理上传时,必须指定一个方法,否则将触发异常,这个委托将被赋值给imageStoringCallback委托类型的变量,同时构造函数会为ImageSlot的id字段赋一个新的Guid值,作为此ImageSlot的标识,构造函数的定义如代码2.4所示。

代码2.4 ImageSlot构造函数

img
img

(3)可以看到这个构造函数是静态private类型的,意味着用户无法直接创建ImageSlot类的实例,用户必须通过静态的CreateImageSlot方法创建一个新的图片槽,定义如代码2.5所示。

代码2.5 CreateImageSlot方法创建图片槽

img

(4)代码使用ImageSlot类的构造函数创建了一个新的图片槽,使用对象初始化语法指定了ImageSlot相关字段的值,最后将这个新建的图片槽添加到了HTTP的会话期变量中,这是由GetImageSlotContainer方法来实现的。因为相册支持多图片上传,因此系统维护了一个图片槽的字典表,该方法的实现如代码2.6所示。

代码2.6 GetImageSlotContainer方法定义代码

img

代码首先从当前HttpContext的Session字典中找到名为ImageSlotContainer的字典表,如果不存在则创建一个新的字典,并添加到会话字典中,然后返回该泛型字典,CreateImageSlot将调用泛型字典的Add方法向容器中加入新的图片槽。

(5)在ImageSlot类中定义了一些属性,以便于控制上传图像时的一些参数,比如目标图片的大小、最后一次访问的日期等,请读者参考配套的源代码。ImageSlot中最重要的方法是AppendChunk方法,用来将图片数据追加到imageBytes这个类级别的私有字段中,最后这个字段的数据会作为委托的参数发送给数据库,该方法的代码较长,定义如代码2.7所示。

代码2.7 AppendChunk方法定义代码

img
img
img

代码较长,为了方便理解,特绘制了图2.16所示的执行流程图。

img

图2.16 代码执行流程图

代码通过将传入的字节数组追加到imageBytes的末尾,然后判断当前添加的数据块是否为最后一个数据块,如果为最后一个数据块,将还原为Bitmap对象,使用ImageSizer类的ResizeTo方法将图片调整为目标大小,最后使用ImageConterter对象将Bitmap转换为字节数组,最后将字节数据作为参数调用委托方法。 x61rfZaEuLfzn+vtrOG/0QQ4GfVUgespjhF0krUbcl5bmaONChLZ9Z8cy2s/Z4Q/

点击中间区域
呼出菜单
上一章
目录
下一章
×