WCF RIA SERVICE如何返回自定义类型(非Entity)
转载
用WCF Ria Service如何返回一个非Entity实体的自定义类型呢?其实很简单,就是用WCF的方式定义可序列化的类型即可。方法:在SilverlightApplication1.Web项目添加一个空的Domain Service,名字叫MyService,里面加一个写一个Invoke的方法。注意这个DomainService需要加[Invoke]属性标明这不是一个Entity相关的操作,也不是Query,Insert,Update,Delete。详细解释请参考MSDN这个页面。
[Invoke]的方法可以返回任何类型,我们这里就让它返回非Entity的自定义的类型好了。首先:
顶一个自定义类型
1
[DataContract]
2
public
class
MyTestClass
3
{
4
[DataMember]
5
public
string
[] MyList{
get
;
set
; }
6
7
[DataMember]
8
public
int
MyData {
get
;
set
; }
9
}
然后:
写一个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
}
编译之后,在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
);
发布并部署到IIS也没有问题,只要加.xap和.xaml两个MIME类型就行了,很简单。