【问题标题】:Collection return type of OperationContract and how to add to a list of DataContracts?OperationContract 的集合返回类型以及如何添加到 DataContracts 列表中?
【发布时间】:2014-05-02 09:50:18
【问题描述】:

我有一个业务领域对象 (BDO) 类:

public class BDO_LIST_DEPARTMENTS
{
    public int DEPARTMENT_ID { get; set; }
    public string DEPARTMENT_NAME { get; set; }
}

然后我有一个DataContract 类:

[DataContract]
public class DC_LIST_DEPARTMENTS
{
    [DataMember]
    public int DEPARTMENT_ID { get; set; }

    [DataMember]
    public string DEPARTMENT_NAME { get; set; }
}

在我的服务层中,我尝试将 BDO 转换为DataContract,然后返回此DataContract 的列表,作为OperationContract 的返回类型:

[OperationContract]
    IList<DC_LIST_DEPARTMENTS> GetAllDepartments();

这是我在服务层中最初的尝试:

public IList<DC_LIST_DEPARTMENTS> GetAllDepartments()
    {
        DC_LIST_DEPARTMENTS DCDepartment = new DC_LIST_DEPARTMENTS();
        IList<DC_LIST_DEPARTMENTS> DCListOfDepartments = new List<DC_LIST_DEPARTMENTS>();
        ICollection<BDO_LIST_DEPARTMENTS> BDOListOfDepartments = Bal.GetAllDepartments();

        foreach (BDO_LIST_DEPARTMENTS BDODepartment in BDOListOfDepartments)
        {
              DCDepartment.DEPARTMENT_ID = BDODepartment.DEPARTMENT_ID;
              DCDepartment.DEPARTMENT_NAME = BDODepartment.DEPARTMENT_NAME;
              DCListOfDepartments.Add(DCDepartment);
        }

        return DCListOfDepartments;
    }

如您所见,我尝试将单个DataContract 添加到IList&lt;DataContract&gt;,但是当我这样做时,它会将列表中的所有其他项目更改为具有相同细节的相同DataContract

因此,我的问题是,OperationContract 的正确返回类型是什么,如何返回 DataContract 类的列表以及如何在不更改所有数据的情况下添加到该列表中列表中的其他项目?

【问题讨论】:

    标签: c# wcf list datacontract operationcontract


    【解决方案1】:

    定义收集数据合约

    [CollectionDataContract]
    public class DC_LIST_DEPARTMENTS_LIST : List<DC_LIST_DEPARTMENTS> {
      ...
    }
    

    并使用此集合数据合约作为操作方法的返回类型。

    public DC_LIST_DEPARTMENTS_LIST  GetAllDepartments() {
       ...
    }
    

    这里是服务方法的修改实现:

    public DC_LIST_DEPARTMENTS_LIST   GetAllDepartments() {
    
                IList<DC_LIST_DEPARTMENTS> DCListOfDepartments = new List<DC_LIST_DEPARTMENTS>();
                ICollection<BDO_LIST_DEPARTMENTS> BDOListOfDepartments = Bal.GetAllDepartments();
    
                foreach (BDO_LIST_DEPARTMENTS BDODepartment in BDOListOfDepartments) {
                    DC_LIST_DEPARTMENTS DCDepartment = new DC_LIST_DEPARTMENTS() {
                        DEPARTMENT_ID = BDODepartment.DEPARTMENT_ID,
                        DEPARTMENT_NAME = BDODepartment.DEPARTMENT_NAME
                    };
                    DCListOfDepartments.Add(DCDepartment);
                }
    
                return DCListOfDepartments;
            }
    

    【讨论】:

    • 感谢您的回复。如果我创建了一个继承 IList 的 CollectionDataContract,我会将什么作为属性放入类中?当我添加到那个类时,它不会产生相同的结果吗?
    • 您的方法“GetAllDepartments()”中的问题是同一个部门对象被多次添加到列表中。并且所有的 dc 部门对象都等于最后一个 BDO 列表对象。
    • 好的,谢谢,您能否提供一个示例,说明 CollectionDataContract 类作为属性的内容,因为它要求实现接口成员 'IList.IndexOf(DC_LIST_DEPARTMENTS )'?
    • 将类 DC_LIST_DEPARTMENTS_LIST 更改为从 List 派生将避免实现所有接口方法。答案已更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2013-08-25
    相关资源
    最近更新 更多