【问题标题】:Object graphs and web services对象图和网络服务
【发布时间】:2010-02-03 13:37:40
【问题描述】:

我对 Web 服务非常陌生,需要创建一个可以处理对象图的 Web 服务。我的典型示例是 CRM Web 服务,给定客户编号将返回 Company 类型的“对象”,其集合属性为 Contacts。

即:

[WebService]
public Company GetCompanyByCustomerNumber( string customerNumber ) {...}

将返回一个实例:

public class Company
{
....
  public List<Contact> Contacts { get { ... } }
}

如果能够创建 web 服务,这样它就可以很容易地从 Visual Studio 中使用,这样它就可以直接与公司和相关联系人一起工作……

这可能吗?

谢谢 弗雷德里克

【问题讨论】:

  • 虽然与此没有明确相关,但我建议您查看 NHibernate 来对您的服务返回的数据进行实际查询,但我承认 WCF 和 NH 的会话管理模式相当复杂。
  • 谢谢,但我在“内部”拥有一切,这是为了与外部交流:-)

标签: c# web-services object-graph


【解决方案1】:

您最好使用Windows Communication Foundation (WCF),而不是 ASMX Web 服务。这样,您就可以定义具有如下属性的 数据契约

[DataContract]
public class Company
{
    [DataMember]
    public Contact[] Contacts { get; set; }
}

【讨论】:

  • 消费者方面是否有工具支持可以理解其中的“图表”,以便调用者可以“按原样”使用它?此外,如果联系人具有支持 ParentCompany 之类的属性,我在某处读到循环依赖不起作用?谢谢
  • 另外,是否可以动态应用这些属性,因为我的公司和联系人确实是同类型“实体”的“实体”,但通过 ICustomTypeDescriptor 可以使用不同的属性?
  • 是的,Visual Studio 2008+ 中有工具支持。我添加了一个链接,您可以在其中阅读更多内容。
  • 循环引用不能很好地序列化,因此不支持。 IIRC,两者都不是动态属性,但是您可以通过实现 IXmlSerializable 从所谓的 DataContractSerialize 回退到 XmlSerializer。
  • 如果Contacts 类有一个DataMember 是Company,那么就好好测试一下。事实问题是关于“图表”而不是“树”的问题正在为……敲响警钟
【解决方案2】:

似乎 .NET Framework 3.5 SP1 中的修复增加了对 DataContract 上的 IsReference 属性的支持正是我所需要的!

所以我可以写:

[DataContract(IsReference=true)]
public class Contact
{
    Company parentCompany;
    [DataMember]
    public Company ParentCompany
    {
        get { return parentCompany; }
        set { parentCompany = value; }
    }

    string fullName;
    [DataMember]
    public string FullName
    {
        get { return fullName; }
        set { fullName = value; }
    }
}

[DataContract(IsReference = true)]
public class Company
{
    string name;
    [DataMember]
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    List<Contact> contacts = new List<Contact>();
    [DataMember]
    public List<Contact> Contacts
    {
        get { return contacts; }
    }
}

感谢所有帮助我朝着正确的方向前进!

//弗雷德里克

【讨论】:

    猜你喜欢
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多