Wcf 在F#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(

据我所知,我可以在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("", "")

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中修改编译的类对象。