在F#Web服务中传递对象与记录

时间:2015-02-24 13:53:51

标签: wcf f#

据我所知,我可以在WCF F#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
    }

Web服务实施:

type SimpleService() =
    interface ISimpleService with
        member x.GetItems() =
            let sql = new SqlConnector()
            let result = sql.GetItems()
            result
        member x.GetPerson() =
            let result = { First = "Steve"; Last = "Holt"; Age = 17 }
            result
        member x.GetPeople() =
            let a = { First = "Steve"; Last = "Holt"; Age = 17 }
            let b = { First = "Dan"; Last = "Woller"; Age = 34 }
            [| a; b |]

我只是想知道哪种方式更好 - 传递对象并在F#服务中传递记录?

正如我所看到的,如果它是用C#编写的话,可以在客户端获取记录作为对象。

我认为我不需要注释我的记录类型以将其作为Web Service的结果或参数传递。

我是对的吗?

1 个答案:

答案 0 :(得分:4)

DataContractDataMember属性aren't required for WCF - 仅推荐(强烈)。

F#记录编译为IL中的不可变类,因此WCF将其视为未注释的不可变类。正如Petr在对问题本身的评论中写道,您可以将[<CLIMutable>]放在您的记录上,如下所示:

[<CLIMutable>]
type Person = 
{
    First : string
    Last : string
    Age : int
}

这将使它看起来像一个可变类(具有无参数构造函数和可写属性)到除F#之外的其他代码。只要您只发送数据(如上面的问题所示),但是如果您想要接收数据(到达),您就不需要在WCF中使用此功能作为XML信息集,WCF必须能够将XML信息集反序列化到您的记录中,并且只有在类可变的情况下才能执行此操作。

您还可以在记录中添加属性,如下所示:

[<DataContract; CLIMutable>]
type Person = 
{
    [<DataMember>]
    First : string
    [<DataMember>]
    Last : string
    [<DataMember>]
    Age : int
}

在服务和客户端之间,没有.NET类型 - 只有XML(信息集)。客户端代码是从WSDL(XML模式文档)生成的,因此C#客户端将在Web服务中生成类型为C#类。