Silverlight中关于DomainService *** 作数据的分析

Silverlight中关于DomainService *** 作数据的分析,第1张

概述在当初搭建项目架构时.考虑到把数据访问和UI分离利用Silverlight RIA Services Class Library类库来搭建底层数据访问. 同时页面显示数据格式较多. 有一部分采用绑定方式.所以用到MVVM[Module-View-ViewModule]框架比较容易, 这样既是把MVVM框架和Ria Service数据访问混合到一块.项目结构: 说明项目结构: HROA_Servic

在当初搭建项目架构时.考虑到把数据访问和UI分离利用Silverlight RIA Services Class library类库来搭建底层数据访问. 同时页面显示数据格式较多. 有一部分采用绑定方式.所以用到MVVM[Module-VIEw-VIEwModule]框架比较容易,这样既是把MVVM框架和Ria Service数据访问混合到一块.项目结构:

说明项目结构:

HROA_Services:Silverlight RIA Services Class library类库 [Ria数据访问]

HROA_Controls:Silverlight项目中常用自定义控件.

HROA_Entitys:MVVM中Module层

HROA_UI:MVVM中VIEw层

HROA_VIEwModules:MVVM中VIEwModule层.

HROA_UI.Web:sliverlight UI承载.

既然实际需求中UI[MVVM中VIEw]层数据显示样式偏多.UI应该可定制的.MVVM框架正是从WPF的MVP[Model-VIEw-Presenter]模式演变而来.数据绑定和VIEwModule相结合突出简单实用 容易 *** 作. 同时把UI与业务逻辑进行分离出来. VIEwModule中保存着UI的特有属性和调用接口.并由一个VIEwModule视图同属性进行绑定. 形成松散的耦合. 个人直观理解:

其实MVVM基于事件绑定机制,在VIEw层中只要完成绑定即可,VIEw会自动更新Model,Model再通知Control,这样就可大量减少VIEw 层中的Control代码. 回想一个WebForm开发VIEw层中需要编写大量控制页面代码.移植和可重用性很低,导致做了很多重复性工作,MVVM恰恰在一定程度上简化这样混乱结构.

 

在项目走到三分之一时.碰到系统核心业务 *** 作. DomainService基于原始四个增删改查数据 *** 作方法已经是力不从心. 其实在项目刚开始时就一直想分析一下DomainService中多种数据 *** 作.前门一章WCF Ria Service 理解制图版本【待续】中简单写了类库结构.今天具体分析DomainService中细节.

A:创建DomainService.

通过创建向导创建时.Enable editing默认不选中.直接创建DomainService则只自动生成1个查询方法.选中后则自动添加增删改查4个方法. 分析这4个自动生成方法:

 

 

 

各个方法返回值定义方式如上.DomainService不仅可以生成如上常用4个方法 也支持用户自定义方法.定义格式如下:

当然在DomainService 也支持Reslove和Invoke方法.定义语法如下:

在技术群里曾有人多次跟我提起 为什么我自定义一个方法返回值为一个Boolean值. 在调用时也用Boolean接受 总是报异常?.例如DomainService自定义:

1    public bool  islogin()
2    {
3       return   " chenkai " .Equals( chenkaige ); // 设定返回结果为False
4    }

UI正确调用方式:

调用测试 InvokeOperation < >  getresinvoke  =  getdomain.islogin();
string  getresult   getresinvoke.Value.ToString();

接受类型应该为InvokeOperation<bool>,在DomainServer中自定义方法islogin并没有带标识属性UseCustomerMethod.但你可以显性的指定它为用户自定义方法.前面提到增删改查4个方法标识 有个在命名上有个特点:

当在4个方法中带了各自标识例如 更新方法前带了[Update]. 既是标识该方法为更新方法.同时该方法命名可以自定义 .如下:

 [Update]
voID  UpdateUserBaseInfor(Sl_Users getuser)
    {
         this .ObjectContext.Sl_Users.AttachAsModifIEd(currentSl_Users,  .ChangeSet.Getoriginal(currentSl_Users)); 
5      }

另外还必须提一点.发生数据冲突[并发]解析方法:

这个问题是在项目后期访问统计图数据遇到的.当多个用户同时更新一张表中同一条记录中相同字段时.DomainSErvice会提示一个异常. 其实这就是常见数据并发.在出现并发保存数据可以采用解析方法.这点对于一个稳定系统而言也很重要,解析方法使用. 

 解析方法保存数据  ResolveSysteUser(Sl_Users currentUser,Sl_Users orginalUser,Sl_Users saveUser,  isDeleteOperator)
{
    false ;
}

 语法定义格式: ResolveSysteUser()参数:

第一个是当前用户实体,第二个最初实体,第三个要保存实体,最后一个参数必须为Bool类型.注意:在此方法定义之前 必须定义该实体的更新方法.否则数据保存失败并提示一个异常.

 另外DomainServer还可以定义另外两种类型方法:服务 *** 作方法和一个规避方法使用的IgnoreOperator属性:

当你需要创建一个方法来 *** 作更多数据或是这个 *** 作方法对不依赖于默认定义CRUD[增删改查]方法 你可以适用ServiceOperator服务 *** 作,例如你可以用它来更新系统用户部分信息. 登录状态等需要动态更新. ServerOperator.参数必须相对应实体类型. 返回值为VoID.但是如果要标识一个方法为ServiceOperator必须在方法前制定标识属性[ServiceOperator].如下:

 1  [ServiceOperation]
 2   ApproveExpenseReport( ExpenseReport expenseReport)
 3   4     if  (expenseReport.Status  == 1
 5   6   (expenseReport.EntityState   System.Data.EntityState.Detached) 
 7   8        Context.Attach(expenseReport);
 9      }
10      expenseReport.Status  2 11    }
12  }

更多关于ServiceOperator *** 作请参见MSDN

IgnoreOperator应用场景为忽略DomainService中特定域方法.

有些时候.我们可以把一些定义DomainService中方法显示排除在外.不想让系统识别它是一个域方法.但仍定义在DomainService中. 既可以 在这些方法标识属性加上[IgnoreOperator] 于是系统把该方法识别一个可忽略方法.

注意[IgnoreOperator]可以用于DomainService中所有方法. 更多关于DomainService方法定义可以参见MSDN

总结

以上是内存溢出为你收集整理的Silverlight中关于DomainService *** 作数据的分析全部内容,希望文章能够帮你解决Silverlight中关于DomainService *** 作数据的分析所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1068174.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存