WCF对象曝光

时间:2009-11-06 13:49:20

标签: c# wcf

我有一个WCF服务需要向其客户端公开自定义集合。我想知道将这个对象暴露给我的客户的最佳方法是什么?

目标代码:

  public class ListBoxDataCollection : System.Collections.CollectionBase
{
    public ListBoxDataCollection()
    {
    }

    public ListBoxData this[int index] 
    {
        get { return (ListBoxData)this.List[index]; }

        set { this.List[index] = value; }
    }

    public int IndexOf( ListBoxData item )
    {
        return base.List.IndexOf(item);
    }

    public int Add( ListBoxData item )
    {
        return this.List.Add(item);
    }

    public void Remove( ListBoxData item )
    {
        this.InnerList.Remove(item);  
    }

    public void CopyTo( Array array, int index )
    {
        this.List.CopyTo(array, index);
    }

    public void AddRange( ListBoxDataCollection collection )
    {
        for (int i = 0; i < collection.Count; i++)
        {
            this.List.Add(collection[i]);
        }
    }

    public void AddRange( ListBoxData[] data )
    {
        this.AddRange(data);
    }

    public bool Contains( ListBoxData item )
    {
       return this.List.Contains(item);
    }

    public void Insert( int index, ListBoxData item )
    {
        this.List.Insert(index, item);
    }
}

4 个答案:

答案 0 :(得分:2)

您使用的是.NET 3.5或更高版本吗?在这种情况下,我会推荐List<ListBoxData>,这似乎是最简单的方法。 WCF对通用列表没有任何麻烦 - 最坏的情况是它会将它们建模为客户端上的ListBoxData数组。

如果你拥有通信的两端,你可以将数据契约(和服务契约)放入共享程序集并在两端使用它,从而解决这个问题 - 在这种情况下,你可以使用{{1在通信的两端。

马克

答案 1 :(得分:1)

使用[DataContract]属性进行装饰。

答案 2 :(得分:1)

嗯,WCF真的不是暴露对象 - 事实上,暴露对象/自定义类型违反了SOA的原则

如果您需要在服务边界的两侧提供类,则需要提供一个库,该库中定义了该类,服务和客户端都可以直接引用该类。

要通过WCF从自定义集合传输数据,最佳做法是定义可用于移动数据的数据协定/数据协定集合(没有任何行为),并将数据转换为您的数据服务电话两侧的自定义集合类型。

因此,当有人调用该服务时,该服务会将该集合转换为DataContract,将其提供给客户端,客户端会将其转换为自定义集合。

答案 3 :(得分:0)

我认为如果你只暴露一个数组会更好。自定义集合意味着其中有一些特殊功能,如特殊排序或行为。 SOA / WCF接口应仅包含数据,而不应包含行为或功能。

在任何分布式系统中通过线路公开功能都是一种反模式。这迫使位于其他平台上的潜在客户复制您的代码,而这反过来又违反了着名的DRY(不要重复自己)原则。