• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

网助的工作随记

软件设计和编码,欢迎同好者 ^_^
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

SilverLight工程的资源,分离、本地化、重用和缓存

其实说的有两个内容,分离资源包和本地化,分离后自然就可以重用做了缓存了。VS2010和RIA的业务模板生成的工程。就经试用成功的步骤,将资源分离为一个公用的资源库工程。因为.net和SilverLight库不能通用,所以要分别建两个资源库工程:.net和silverLight库。

既然叫本地化,目的当然是给用户看,而服务端程序只是给程序员看,并不需要本地化。服务端的的数据之所以本地化,是那些用链接到SL工程的数据类和服务类需要。以上所知,要本地化的数据分为两部分,服务端导给客户端的和客户端界面独用的。.

net库包括了服务端数据资源,silverLight库包括服务端数据和客户端数据资源。而两者共有的资源文件,通过VS链接文件机制做共享。两个工程的命名空间,因为资源代码会随着不同命名空间而改变。

 

资源库工程

Workerbee.OPAS.Resource.Strings(SL)

Workerbee.OPAS.Resource.Strings.Web(.Net)

相同步骤

工程信息设置:

程序集和命名空间都不用改,确保命名空间与第一行一致,以避免对资源编辑后,资源代码错误的命名空间,导致程序找不到对应资源而异常。

程序集版本:我设置的是自动0.1.*。默认语言是en(MSDN讲这里设置文化而不是具体区域)。我的程序集都设置了签名。

引用内只保留: system和mscorlib/core 两个库。

不同步骤

1、工程根建立一个名Web的文件夹,将Web工程Resources目录下的资源文件RegistrationDataResources.resx和ValidationErrorResources.resx剪贴到web文件夹内,并保证其文件属性内的自定义工具命名空间为空。分别打开,访问修饰符切换选public,这样对应会按本工程默认命名空间生成资源代码文件。
代码文件有两点要保证,一是命名空间要保持是Workerbee.OPAS.Resource.Strings.Web,这样便于方案内多工程重用,二是修改访问符会更新代码中的静态属性ResourceManager的指向,例如“Workerbee.OPAS.Resource.Strings.Web.RegistrationDataResources”。

2、将原有这2个resx视做英文版,复制文件建立一个中国版本RegistrationDataResources.zh-CN.resx,这里需要是具体指定区域代码。SL会自动查找模糊的语言,如果你只有简体中文资源,是繁体的IE客户端,也会显示简体中文而不会是默认的英文。修改默认语言的资源文件字符串为英文,以方便后面测试。

 

 

 

 

5、在SL RIA客户应用程序工程(不是库),加入本工程为引用,尝试编译出错。类似问题,步骤1中数据用的资源命名空间已经改变了,但是在本客户端模板生成的登录控件用并未改变,同样using Workerbee.OPAS.Resource.Strings.Web,修改到再编译成功为止。

6、这条是MSDN讲的,在SL RIA客户应用程序工程点卸载,再右键点选择编辑xxxx.csproj,对应步骤2修改为<SupportedCultures>zh-CN</SupportedCultures>,注意不要加默认语言。如果多语言,用豆号和分号。如果此处加入的区域在步骤1时没有建立,会提取不到xap下载包等。保存后,重新加载项目。如果只打包步骤1建立若干包中的少数,可以用VS的配置来管理,MSDN有讲。再编译。

 

 

 

 

 

 

3、本工程右击这个根添加现有项,以文件链接方式加入前面4个resx文件。
    分别打开不带区域后缀的资源文件,如RegistrationDataResources.res,选择public,这样会在resx文件下显示对应的代码,如果不做,应用时会提示找不到代码文件所产生的类。
    此根的命名空间和工程1的Web目录的命名空间一致,这很重要,保证生成资源代码的命名空间不会错。
    改变资源工程的默认命名空间后,如果再修改资源或修改修饰符,代码文件会随着改变指向,如果默认命名空间与与SL工程不对应,应用时会造成找不到异常。

4、来到依赖于本工程的Web工程,加入本工程的引用,编译一下,会出错,提示一些数据类找不到验证类,修改原有的using指向,using Workerbee.OPAS.Resource.Strings.Web,修改到再编译成功为止。

 

 

结果

此时打开web工程的clientBin目录,我勾选过silverLight缓存,发现语言包Workerbee.OPAS.Resource.Strings.zip已经分独立出来了。用winrar打开,看到有一个Workerbee.OPAS.Resource.Strings.dll文件,还有一个zh-CN的目录且下面有同名文件。关于为什么会分离,看.extmap.xml资料。我自编的emGen.exe加到了工程1,每次改变都会自动生成新的配置文件。

F5运行,点右上方的登录按钮,看到界面是中文的。IE选项->常规->语言,加英国en-GB,并移到顶,确定。F5刷新,再按登录按钮,看到用户名已经显示为Username。

 

之前说过的本地化分为两部分,还有客户端独用的没有做,继续。

1、 在SL RIA应用程序项目,将Assets\Resources下3个资源文件ApplicationStrings.resx、ErrorResources.resx、SecurityQuestions.resx ,Ctrl+左键选择,剪贴到之前提到的SL资源库项目根下。

对于ApplicationResources.cs这个快捷方式的类,本来不需要剪,但因为资源代码类的构造函数是internal,所以这个快捷方式类也要过来。

2、 在SL资源工程,分别清空resx文件属性中的自定义工具命名空间,再打开代码文件查看,类的命名空间和静态属性ResourceManager的指向都已经对应了本资源工程(同前表步骤1)。

同前表的步骤2,复制3个resx,并修改成ApplicationStrings.zh-CN.resx等。返回来修改默认语言的ApplicationStrings.resx内资源为英语。

再修改ApplicationResources.cs类的命名空间与本工程一致Workerbee.OPAS.Resource.Strings,去掉所有多余的using。Shift+F6编译一下。

3、 回到SL RAI应用程序项目,编译一下,N多错误,多是些控件找到资源类,不要紧一个个来改。对于这些控件类,加using Workerbee.OPAS.Resource.Strings;。随着这行的加入,可以看到vs2010下的错误列表慢慢减少,最后没有了。

再编译,在app.xaml中资源指向错误,加入命名空间xmlns:res="clr-namespace:Workerbee.OPAS.Resource.Strings;assembly=Workerbee.OPAS.Resource.Strings",改为<res:ApplicationResources x:Key="ApplicationResources" />。再编译,成功。

4、F5调试,同前一样,有IE语言配置里,里切换中文系或英文系并刷新页面,可以看到主页的字符也变过来了。

将系统的5个resx默认语言资源文件都放入了SL资源库,从分散的目录放入一个工程目录,首个好处就是易于管理。
以上花费了如此多的文字,分离出RIA资源包,有什么用呢,目的归根结底是共享重用。
一个VS方案里很多,一个网站可能包括多个xap应用程序,又共享多个silverLight库,web端服务也可能还有库工程,这些都重复的使用资源。如果没有提炼,资源还是主工程内,那么可能每次都客户程序的改变都导致重新下载未变的资源,而如果只是字符串还好,如果是图片库什么的,呵。以上工程名起的是xxxx.Resource.Strings是指字符串资源,同理可建xxxx.Resource.Images资源工程等。
当然用WebClient是一种办法,但MSDN里明确说这样是始终下载,不受浏览器缓存支持,而SL框架提供的缓存机制就浪费了。
本文涉及到了extmap.xml文件相关(不了解可去查),在本方案里这种配置文件都是自动生成,所有系统库、自定义库和资源库都生成到ClientBin下独立成包, xap包内只有主工程的dll和部署文件。

注意:因为微软的一个bug,某种时刻新建Resource库后,生成SLAPP时会发生未知异常,在网上查到过这个问题,但只被官网回信没有解决。我找到的原因是Resource不能复数写成(Resources),否则就可能编译不通过,可能与生成工具内部冲突吧。起名Resource不会有问题,本方案是通过实际验证的。

posted on 2012-12-22 13:34  网助  阅读(471)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3