Wcf 在F#web服务中传递对象与记录
据我所知,我可以在WCF#Web服务中传递对象和记录:Wcf 在F#web服务中传递对象与记录,wcf,f#,Wcf,F#,据我所知,我可以在WCF#Web服务中传递对象和记录: [<DataContract>] type Item(id : string, name : string) = [<DataMember>] member val ItemId = id with get, set [<DataMember>] member val ItemName = name with get, set new() = new Item(
[<DataContract>]
type Item(id : string, name : string) =
[<DataMember>]
member val ItemId = id with get, set
[<DataMember>]
member val ItemName = name with get, set
new() = new Item("", "")
type Person =
{
First : string
Last : string
Age : int
}
我只是想知道哪种方式更好——在F#service中传递对象和传递记录
如我所见,如果记录是用C#编写的,那么在客户端就可以将其作为对象获取
正如我所看到的,我不需要注释我的记录类型来将其作为Web服务的结果或参数传递
我说得对吗?仅推荐使用
DataContract
和DataMember
属性(强烈推荐)
F#记录编译为IL中的不可变类,因此WCF将其视为未注释的不可变类。当Petr在对问题本身的评论中写道时,您可以将[]
放在记录中,如下所示:
[<CLIMutable>]
type Person =
{
First : string
Last : string
Age : int
}
[<DataContract; CLIMutable>]
type Person =
{
[<DataMember>]
First : string
[<DataMember>]
Last : string
[<DataMember>]
Age : int
}
[]
类型人=
{
第一:字符串
最后:字符串
年龄:整数
}
这将使它在F#以外的代码中看起来像一个可变类(具有无参数构造函数和可写属性)。在WCF中,只要您只发送数据(如上面的问题),就不需要这样做,但是如果您想接收数据(以XML信息集的形式到达),WCF必须能够将XML信息集反序列化到您的记录中,并且只有在类是可变的情况下才能这样做
您还可以在记录上添加属性,如下所示:
[<CLIMutable>]
type Person =
{
First : string
Last : string
Age : int
}
[<DataContract; CLIMutable>]
type Person =
{
[<DataMember>]
First : string
[<DataMember>]
Last : string
[<DataMember>]
Age : int
}
[]
类型人=
{
[]
第一:字符串
[]
最后:字符串
[]
年龄:整数
}
在服务和客户端之间,没有.NET类型,只有XML(Infoset)。客户机代码是从WSDL(XML模式文档)生成的,因此C#客户机将在web服务中将类型生成为C#类。记录被编译为具有公共只读属性的可序列化密封.NET类。因此,哪种方法更好取决于您希望如何使用这个类。对于记录,您可以使用属性
[]
,然后可以在C#code中修改编译的类对象。