【问题标题】:Passing objects vs records in F# web service在 F# Web 服务中传递对象与记录
【发布时间】:2015-02-24 13:53:50
【问题描述】:

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

网络服务实现:

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 服务的结果或参数传递。

我说的对吗?

【问题讨论】:

  • Record 被编译为具有公共只读属性的可序列化密封 .NET 类。所以哪种方式更好取决于你想如何使用这个类。对于记录,您可以使用属性[&lt;CLIMutable&gt;] 然后可以在 C# 代码中修改编译的类对象。

标签: wcf f#


【解决方案1】:

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

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

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

对于 F# 以外的其他代码,这将使它看起来像一个可变类(具有无参数构造函数和可写属性)。只要您只 send 数据(如您上面的问题),您就不需要在 WCF 中使用此功能,但如果您想要 receive 数据(以 XML 形式到达infosets),WCF 必须能够将 XML 信息集反序列化到您的记录中,并且只有在类是可变的情况下才能做到这一点。

您也可以将属性放在记录中,如下所示:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2013-10-21
    相关资源
    最近更新 更多