Silverlight商业应用程序开发学习笔记Word文档下载推荐.docx
- 文档编号:16452385
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:80
- 大小:3.24MB
Silverlight商业应用程序开发学习笔记Word文档下载推荐.docx
《Silverlight商业应用程序开发学习笔记Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Silverlight商业应用程序开发学习笔记Word文档下载推荐.docx(80页珍藏版)》请在冰豆网上搜索。
2、创建域服务:
域服务更像是一个标准的WCF服务,但遵循一些给定的模式并提供了基本的功能。
一般来说,对每个数据集都应配置一个相应的域服务,比如products,customers等;
3、在域服务中创建域操作:
主要是实现CRUD功能,使用客户端与服务器端进行交互。
例如,对Product域服务通常需要配置如下域操作:
GetProducts,InsertProduct,UpdateProduct和DeleteProduct;
4、使用验证逻辑和其他特性标记修改实体:
域服务所暴露的实体可以使用特性进行修饰(比如数据验证规则),也可以直接将属性设置到关联类上(称之为元数据类)。
5、设置可供服务器与客户端共享的代码:
只需要将想要共享的代码放置在以.shared.cs扩展名的文件中即可;
6、在客户端项目调用域服务:
RIA服务自动在客户端项目生成代码,这些代码可以与服务器上的域服务进行交互。
RIA服务为每个域服务创建了一个域上下文,为每个域服务暴露的实体创建了相应的代理类。
现在就可以使用域上下文(domaincontexts)从服务器上获取数据,对数据进行处理,并将任何变更保存到服务器上。
WCFRIA服务器如何生成代码
EIA服务需要服务器与客户端项目必须处于同一解决方案中并彼此连接。
服务器端包含暴露数据的服务,而客户端与服务器端进行通信并使用数据。
在服务器端创建域服务以后,RIA服务就创建了代码生成任务(一般称为投影),会生成相应代码和相关代码数据对象类(一般称这为实体,在客户端任何实体都是由服务所暴露的,可以应用特性,如验证逻辑;
也可以将代码进行复制并标记为共享代码,供服务器端项目与客户端项目共享使用)。
如图所示:
在SilverLight项目(客户端)有一个Generated_Code文件夹,这是在Silverlight项目编译时由RIA服务建立的。
这可以命名客户端项目可以访问所有由RIA服务暴露的操作,数据,逻辑。
注意生成的代码不要手工修改,重新编译后会被覆盖掉,如果想要更改,因为生成的代码是部分类,可以根据需要在其他位置编写代码。
创建RIA服务连接
如果使用SilverLight业务应程序项目模板,默认已经配置了RIA服务,提供了一些基本功能。
上图中项目中有一个Services文件夹与Models文件夹。
Service文件夹已经包含了两个域服务(AuthenticationService和UserRegistrationService),用于对客户端的授权以及用户注册。
Models文件夹包括两个数据类(User和RegistrationData),用于在服务器与客户端进行传递。
在Models文件夹下还有一个Shared文件夹,有一个文件User.shared.cs,包含有可供服务器与客户端项目共享的代码。
RIA服务的连接配置方法如下:
如果想要在现有的Silverlight项目与Web项目间使用RIA服务,可以使用这一属性进行手工连接。
域服务
创建RIA服务连接后,就需要暴露来自于服务器的数据与操作。
达成此目的,需要使用域服务,典型的域服务包括基本的CRUD操作和任何可在客户端调用的其他定制操作。
创建域服务最简单的方法是使用DomainServiceItem模板和AddNewDomainServiceClass向导,
注:
在运行向导之前已经通过EF框架生成了实体类和上下文类(ObjectContext);
对这个对话框解释一下:
“可用的DataContext/ObjectContext”下拉列表:
该下拉列表用于选择EF模型;
如果模型未显示,请先生成项目;
如果使用POCO类,应选择<
空域服务类>
选项,然后手工实现相关的域操作。
实休列表:
列出了所有可供处理的实体。
选定的实体在域服务中会创建操作,该操作返回相应实体的集合。
如果想要修改实体,则勾选”EnableEditing“选项,然后向导会为每个实体创建insert,update和delete域操作。
EnablingClientAccess:
必须进行选定,这个选项会在域服务类上装饰EnableClientAccess特性标识,用来提示RIA服务的代码生成器应该在客户端项目中生成代码。
ExposinganODataEndpoint:
这个选项可以用于SharePoint,由于对其研究不多,不再赘述;
默认不需要选择此选项。
Silverlight商业应用程序开发---学习笔记
(2)
(2)
1125次
GeneratingAssociatedClassesforMetadata:
为每个选定的实体生成元数据类,可以在该类中对实体的类、属性进行特性标记修饰,而无需修改实体本身。
元数据类扩展名为.metadata.cs,例如ProductService域服务会创
GeneratingAssociatedClassesforMetadata:
元数据类扩展名为.metadata.cs,例如ProductService域服务会创建ProductService.metadata.cs文件,包含有所有该域服务暴露的实体的所有元数据类,
域操作
域操作是域服务上的方法,可以在客户端进行调用。
除了常规的CRUD以外,也可以设置定制的方法。
AddNewDomainServiceClasswizard创建了CRUD功能的方法,理解了这些方法,就可以用来创建自已的方法了。
为了使用RIA服务能够正确地在客户端项目中生成相应的代码,默认情况下需要执行一些的规则,包括方法命名和方法签名等(当然也可以定制自已的方法命名和签名规则,但需要在在方法上加注特性标记以指明是哪种操作模式)。
下面是各类操作的默认方法:
查询:
命名规则/方法签名规则:
查询操作无命名规则,可接受任何参数或无参数,因为可以被RIA服务隐匿识别为查询操作,但是最好返回IQueryable,IEnumerable,或单个实体,并对方法修饰Query标记;
返回集合的方法:
publicIQueryable<
Product>
GetProducts()
{
returnthis.ObjectContext.Products;
}
GetProducts(stringnameFilter)
returnthis.ObjectContext.Products.Where(p=>
p.Name.StartsWith(nameFilter));
返回值实现IQueryable接口,可以直接应用LINQtoEntities,并且可以实现RIA服务提供的很多有用的功能。
返回单个实体
publicProductGetProduct(intproductID)
returnObjectContext.Products
.Where(p=>
p.ProductID==productID)
.FirstOrDefault();
}
Insert/Update/Delete操作
命名、方法签名规则:
insert/update/delete操作必须接受一个单个实体作为参数,并且无附加参数,无返回值;
并且在命名方法时应注意:
Insert操作方法必须开始于Insert,Create,Add。
否则需要在方法上修饰Insert标记;
Update操作方法必须开始于Update,Change或Modify。
否则需要在方法上修饰Update标记;
Delete操作方法必须开始于Delete或Remove。
否则需要在方法上修改Delete标记;
Insert/Update/Delete操作的域服务循环
authorizechangeset阶段:
检查每个对changeset调用的操作是否遵循安全相关的规则,这些规则在域服务的操作上定义,方法是在操作上修饰安全规则特性标识。
validatechangeset阶段:
检查验证规则
executechangeset阶段:
执行
persistchangeset阶段:
调用SubmitChanges方法,将数据持久化到数据库;
每个步骤都由域服务自动执行;
但是,也有相应的方法可以覆写从而跳过某几个步骤进行定制,这些方法包括:
AuthorizeChangeSet
ValidateChangeSet
ExecuteChangeSet
PersistChangeSet
Insert/Update/Delete操作例子:
插入数据:
publicvoidInsertProduct(Productproduct)
if(product.EntityState!
=EntityState.Added)
{
=EntityState.Detached)
this.ObjectContext.ObjectStateManager.ChangeObjectState(product,
EntityState.Added);
}
else
this.ObjectContext.AddToProducts(product);
更新数据:
publicvoidUpdateProduct(ProductcurrentProduct)
if(currentProduct.EntityState==EntityState.Detached)
this.ObjectContext.Products.AttachAsModified(currentProduct,
this.ChangeSet.GetOriginal(currentProduct));
删除操作
publicvoidDeleteProduct(Productproduct)
if(product.EntityState==EntityState.Detached)
this.ObjectContext.Attach(product);
this.ObjectContext.DeleteObject(product);
调用操作
调用操作通常用于实例化服务器上的行为,比如请求服务器发送邮件,或者请求服务器返回一个简单的值(该值通常不需要对变更进行跟踪),比如汇率。
与查询操作一样,异步调用操作也可以由客户端应用直接调用,这些调用是立即完成的,不像常规操作那样需要changeset提交到服务器上才进行调用。
尽管调用操作概念上来说与普通的WCF服务操作相同,但是它们不能返回复杂的类型,除了实体对象外。
这可能是使用RIA服务所要面对的一个非常大的问题。
这意味着要向客户端返回复杂的对象类型是不可能的,解决这个问题的唯一方法是用回到纯WCF通信,希望这个问题在将来能得以克服。
调用操作不需要命名或方法签名约定(惯例),实质上任何领域服务中的操作,只要不属于任何其他类型的操作分类(通过命名或方法签名)就会被RIA服务认为是一个调用操作。
也可以通过为方法应用Invoke来显示将一个方法作为调用方法。
调用操作的示例如下所示:
publicdecimalGetExchangeRate(stringfromCurrency,stringtoCurrency)
returnExchangeRates.GetRate(fromCurrency,toCurrency);
自定义操作
自定义操作用于在一个实体上完成一些行为的操作,比如,你可能有一个操作来停用一个产品,所有这些逻辑将在服务器端完成,但是当客户端使用调用操作时,会被立即执行。
自定义操作不会立即执行,它会延迟执行到客户端向服务器端提交了一个变更集,可以将自定义操作看在是与插入/更新/删除相同的操作。
当客户端生成一个自定义操作时,它将作为实体的一个方法被创建,然后对那个实体发生作用,同时它也被创建在实体上下文级别,以便进行调用。
自定义方法通常是在插入或更新操作在服务器端被调用后才执行,如果一个自定义的操作在一个实体上被调用,但是随后那个实体被删除,那么自定义方法将不会被调用,而是被丢弃。
自定义操作没有命名惯例,但是它们必须没有返回值,必须接收一个实体对象作为其第1个参数(任意个数的其它参数也是被允许的)。
没有什么显然的特性来标识一个自定义操作,但是相反你应该使用Update特性,设置其UsingCustomMethod属性值为True。
自定义操作示例如下所示:
publicvoidDiscontinueProduct(Productproduct)
//Logictodiscontinuetheproduct...
实体修饰
实体修饰可以达成三个目的:
控制实体在客户端的显示,应用验证规则,指定某属性的数据特性(如是否为主键,是否执行并发检查等),需要在元数据类上进行设置。
[MetadataTypeAttribute(typeof(Product.ProductMetadata))]
publicpartialclassProduct
internalsealedclassProductMetadata
//Fielddefinitions(removedforthepurposesofbrevity)
上述代码是Product实体的元数据类,特点有:
是Product的部分类,ProductMetadata是Product的嵌套类(尽管这不是必须的),通过MetadatTypeAttribute特性标记标识哪个类是Product的元数据类)。
通用特性的使用方法可参考
自定义验证特性(以案例说明):
1、在Web项目里新建一个文件夹:
ValidationRules。
2、添加一个新类到ValidationRules文件夹:
ProductClassValidationAttribute.shared.cs,使用.shared意味着代码可以在服务器与客户端共享。
3、取消对System.Web名称空间的引用,因为Silverlight并不支持名称空间
Silverlight商业应用程序开发---学习笔记(3)
2012-05-0817:
55来源:
444次
创建PresentationModel类PresentationModel类用于如下情况:
1)在应用程序中不使用EFmodel;
2)不想让显示层与数据访问层进行共享,保持两层之间的独立性;
3)模块中的实体与显示层并不是一对一的匹配关系,显示的数据可能是多个实体聚合的结果;
4)需要统计数据(求和,平均等);
5)需要格式化数据从而适合显示界面;
创建
创建PresentationModel类
PresentationModel类用于如下情况:
1)在应用程序中不使用EFmodel;
2)不想让显示层与数据访问层进行共享,保持两层之间的独立性;
3)模块中的实体与显示层并不是一对一的匹配关系,显示的数据可能是多个实体聚合的结果;
4)需要统计数据(求和,平均等);
5)需要格式化数据从而适合显示界面;
创建PresentationModel类步骤如下:
构建类,包含所有需要在客户端显示的属性;
构建域服务类,继承自DomainService;
手工配置get/query域操作,暴露给Presentationmodel;
需要进行数据编辑,手工实现insert/update/delete操作
实例:
1、注意事项:
至少有一个属性以Key特性修饰,指定其为主键;
可以使用所有修饰特性标记;
如果不想在类上修饰,也可以建立相应的元数据类,添加相应的修饰;
Presentationmodel类可以根据需要放置在解决方案中的适当项目中,不限于Web项目中;
2、具体实现
1)在Web项目的Models文件夹下创建一个新类,命名为ProductSummary。
2)向类中添加适当引用,添加相应属性,代码如下:
usingSystem;
usingSystem.ComponentModel.DataAnnotations;
namespaceAdventureWorks.Web.Models
publicclassProductSummary
[Key]
[Editable(false)]
publicintID{get;
set;
publicstringName{get;
publicstringNumber{get;
publicdecimalListPrice{get;
publicbyte[]ThumbnailPhoto{get;
publicint?
QuantityAvailable{get;
publicstringCategory{get;
publicstringSubcategory{get;
publicstringModel{get;
publicboolMakeFlag{get;
publicDateTimeModifiedDate{get;
3、填充或暴露PresentationModel类型:
1)在Web项目的Service文件夹,使用DomainServiceClass项目模板,添加一个名为ProductSummaryService的域服务类。
因为数据仍然是取自于实体模型,因此需要选择AdventureWorksEntities实体模型作为对象上下文。
不要选择实体列表中的任何实体,只需要点击OK按钮。
这就创建了空白的域服务:
namespaceAdventureWorks.Web.Services
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.ComponentModel.DataAnnotations;
usingSystem.Data;
usingSystem.Linq;
usingSystem.ServiceModel.DomainServices.EntityFramework;
usingSystem.ServiceModel.DomainServices.Hosting;
usingSystem.ServiceModel.DomainServices.Server;
usingAdventureWorks.Web;
//ImplementsapplicationlogicusingtheAdventureWorksEntitiescontext.
//TODO:
Addyourapplogictothesemethodsorinadditionalmethods.
Wireupauthentication(Windows/ASP.NETForms)anduncommentthe
//followingtodisableanonymousaccess.
//Alsoconsideraddingrolestorestrictaccessasappropriate.
//[RequiresAuthentication]
[EnableClientAccess()]
publicclassProductSummaryService:
LinqToEntitiesDomainService<
AdventureWorksEntities>
2)添加对AdventureWorks.Web.Models名称空间的引用;
3)向域服务中添加查询操作,要求返回IQuer
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Silverlight 商业 应用程序 开发 学习 笔记