WCF中的Data Contract:对Generic的支持
所以WCF需要为此提供这样的机制:基于不同的泛型类型参数生成不同Data Contract Name,这样才能解决命名冲突。我们可以稍微修改一下Data Contract 的定义就可以了:
[DataContract(Name="Bill_{0}_{1}")]
public class Bill<THeader, TDetail>
{
[DataMember]
public THeader Header
{ get; set; }
[DataMember]
public IList<TDetail> DetailList
{ get; set; }
}
其中{0}和{1}分别代表第一个泛型类型参数和第二个泛型类型参数的名称,一次类推,你可以根据参数类型的个数设置{2}{3}… 这样我们生成的两个DataContract的名称为:Bill_OrderHeader_OrderDetail和Bill_SalesHeader_SalesDetail。
但是这并没有根本解决问题,如果在我现在不同的Namespace中创建了两个OrderHeader和OrderDetail呢?这无疑在.NET中是合法的,但是对于DataContract有有可能出现命名冲突。
这也就是为什么WCF默认机制下会为Data Contract Name添加一个额外hash value的原因。其实你也可以以你自己的方式添加这个Hash value:
[DataContract(Name="Bill_{0}_{1}_{#}")]
public class Bill<THeader, TDetail>
{
[DataMember]
public THeader Header
{ get; set; }
[DataMember]
public IList<TDetail> DetailList
{ get; set; }
}
上面的{#}就代表这样一个Hash Value, 我想你会想到现在生成的Data Contract Name象什么样子:Bill_OrderHeader_OrderDetail_LZ9Dq20o 和Bill_SalesHeader_SalesDetail_LZ9Dq20o 0
相关文章