我有一个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);
}
}
答案 0 :(得分:2)
您使用的是.NET 3.5或更高版本吗?在这种情况下,我会推荐List<ListBoxData>
,这似乎是最简单的方法。 WCF对通用列表没有任何麻烦 - 最坏的情况是它会将它们建模为客户端上的ListBoxData
数组。
如果你拥有通信的两端,你可以将数据契约(和服务契约)放入共享程序集并在两端使用它,从而解决这个问题 - 在这种情况下,你可以使用{{1在通信的两端。
马克
答案 1 :(得分:1)
使用[DataContract]属性进行装饰。
答案 2 :(得分:1)
嗯,WCF真的不是暴露对象 - 事实上,暴露对象/自定义类型违反了SOA的原则
如果您需要在服务边界的两侧提供类,则需要提供一个库,该库中定义了该类,服务和客户端都可以直接引用该类。
要通过WCF从自定义集合传输数据,最佳做法是定义可用于移动数据的数据协定/数据协定集合(没有任何行为),并将数据转换为您的数据服务电话两侧的自定义集合类型。
因此,当有人调用该服务时,该服务会将该集合转换为DataContract,将其提供给客户端,客户端会将其转换为自定义集合。
答案 3 :(得分:0)
我认为如果你只暴露一个数组会更好。自定义集合意味着其中有一些特殊功能,如特殊排序或行为。 SOA / WCF接口应仅包含数据,而不应包含行为或功能。
在任何分布式系统中通过线路公开功能都是一种反模式。这迫使位于其他平台上的潜在客户复制您的代码,而这反过来又违反了着名的DRY(不要重复自己)原则。