[Silverlight]WCF RIA SERVICE如何返回自定义类型(非Entity)
2011-08-19 14:38 suzh 阅读(717) 评论(0) 编辑 收藏 举报用WCF Ria Service如何返回一个非Entity实体的自定义类型呢?其实很简单,就是用WCF的方式定义可序列化的类型即可。方法:在SilverlightApplication1.Web项目添加一个空的Domain Service,名字叫MyService,里面加一个写一个Invoke的方法。注意这个DomainService需要加[Invoke] 属性标明这不是一个Entity相关的操作,也不是Query,Insert,Update,Delete。详细解释请参考MSDN这个页面。
[Invoke]的方法可以返回任何类型,我们这里就让它返回非Entity的自定义的类型好了。首先:
顶一个自定义类型
然后:
写一个DomainService
1 [EnableClientAccess()]
2 public class MyAppService : DomainService
3 {
4 [Invoke]
5 public MyTestClass Test(string a, string b)
6 {
7 //TODO: ....
8 return new MyTestClass(); //返回自定义类型
9 }
10
11 protected override void OnError(DomainServiceErrorInfo errorInfo)
12 {
13 base.OnError(errorInfo);
14
15 Logger.LogException(errorInfo.Error.Message, errorInfo.Error.StackTrace);
16 }
17 }
2 public class MyAppService : DomainService
3 {
4 [Invoke]
5 public MyTestClass Test(string a, string b)
6 {
7 //TODO: ....
8 return new MyTestClass(); //返回自定义类型
9 }
10
11 protected override void OnError(DomainServiceErrorInfo errorInfo)
12 {
13 base.OnError(errorInfo);
14
15 Logger.LogException(errorInfo.Error.Message, errorInfo.Error.StackTrace);
16 }
17 }
编译之后,在RiaService对应的前台Silverlight项目(具体可以查看project的属性,有WCF Ria Service Link),可以看到隐藏的文件:Generated_Code\*.web.g.cs。里面自动生成了WCF的本地代理和本地类型。然后在Silverlight里面可以这样调用:
*.xaml.cs
1 MyTestContext ctx = new MyTestContext();
2
3 ctx.Test("a","b", invokeOperation =>
4 {
5 if (invokeOperation.HasError)
6 {
7 this.label1.text = invokeOperation.Error.Message;
8 }
9 else
10 {
11 MyTestClass result = invokeOperation.Value;//得到自定义的类型的结果
12 //TODO:.....
13 }
14 }, null);
2
3 ctx.Test("a","b", invokeOperation =>
4 {
5 if (invokeOperation.HasError)
6 {
7 this.label1.text = invokeOperation.Error.Message;
8 }
9 else
10 {
11 MyTestClass result = invokeOperation.Value;//得到自定义的类型的结果
12 //TODO:.....
13 }
14 }, null);
发布并部署到IIS也没有问题,只要加.xap和.xaml两个MIME类型就行了