规划步骤 5:确定每个方法的输入、输出和返回参数
上次修改时间: 2010年4月19日
适用范围: SharePoint Server 2010
Business Data Connectivity (BDC) Service 生成 Web 服务代理以访问 Web 服务。因此,对于每个方法,通过研究 Web 服务代理中的相应 Web 方法来确定 in、out 和 return 参数。每个参数将获取 Name 属性的一个值,此属性值可设置为任何有意义的名称。可通过插入类型为 TypeDescriptor 的子元素来提供参数的详细信息。TypeDescriptor 元素具有一个 Name 属性。
在顶级(根 TypeDescriptor)上,可以将 TypeDescriptor 命名为任何所需的名称。
对于子 TypeDescriptor,名称必须是父 TypeDescriptor 所引用的 .NET 类型中的 .NET Framework 访问器的名称。例如,由于"WorkPhoneNumber"是父 TypeDescriptor(即,SampleWebProxy.Customer)的类型的 .NET 属性/字段,将写入 Name 为"WorkPhoneNumber"的 TypeDescriptor。
IsCollection 设置为 true 的 TypeDescriptor 的子 TypeDescriptor 也可命名为任何所需的名称。
对于表示数组的输入参数的 TypeDescriptors,可以定义用于使用默认输入值填充数组的元数据。为此,可定义输入参数的 TypeDescriptor,它表示其 IsCollection 标记设置为 false 的数组。然后,创建 n 个 TypeDescriptors,其默认值对应于要在执行方法时添加到输入数组中的 n 个值。
此外,TypeDescriptor 的类型应与代理中的类型匹配。如果 TypeDescriptor 代表实体的唯一键,则属性 IdentifierName 将指向对应的 Identifier 元素。TypeDescriptor 元素的最后一个属性是 AssociatedFilter 属性,该属性用于将 与为实体定义的 FilterDescriptor 元素相链接。该属性将要求 BDC 在执行 Web 方法调用之前将筛选器的值插入参数的此部分。
以下是 SampleWebService 代理中的 GetCustomers 方法的定义。可从此处派生输入和顶级返回参数。
public Customer[] GetCustomers(string name, [System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] System.Nullable<int> limit) {
object[] results = this.Invoke("GetCustomers", new object[] {
name,
limit});
return ((Customer[])(results[0]));
}
对于返回参数,可将返回结果定义为 BDC 的实体实例的字段。第一个子 TypeDescriptor 定义了代理中由方法实例(Web 方法)返回的类型,在本例中此类型为一个客户数组:SampleWebServiceProxy.Customer[]。第二个 TypeDescriptor 元素定义了该数组中的每个对象;在本例中,每个对象的类型为 SampleWebServiceProxy.Customer。其余的每个 TypeDescriptor 元素详细说明了 Customer 实例的每个字段。
这是 SampleWebService 代理中的 Customer 类定义。您可从此处派生返回参数的子 TypeDescriptors。
public partial class Customer {
private string customerIDField;
private string nameField;
private System.Nullable<long> workPhoneNumberField;
private System.Nullable<long> mobilePhoneNumberField;
private string industryField;
private string webSiteField;
private CustomerAddress[] customerAddressesField;
private string parentCustomerIDField;
/// <remarks/>
public string CustomerID {
get {
return this.customerIDField;
}
set {
this.customerIDField = value;
}
}
/// <remarks/>
public string Name {
get {
return this.nameField;
}
set {
this.nameField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public System.Nullable<long> WorkPhoneNumber {
get {
return this.workPhoneNumberField;
}
set {
this.workPhoneNumberField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public System.Nullable<long> MobilePhoneNumber {
get {
return this.mobilePhoneNumberField;
}
set {
this.mobilePhoneNumberField = value;
}
}
/// <remarks/>
public string Industry {
get {
return this.industryField;
}
set {
this.industryField = value;
}
}
/// <remarks/>
public string WebSite {
get {
return this.webSiteField;
}
set {
this.webSiteField = value;
}
}
/// <remarks/>
public CustomerAddress[] CustomerAddresses {
get {
return this.customerAddressesField;
}
set {
this.customerAddressesField = value;
}
}
/// <remarks/>
public string ParentCustomerID {
get {
return this.parentCustomerIDField;
}
set {
this.parentCustomerIDField = value;
}
}
}
以下是 XML 元数据中 GetCustomers 方法的输入和返回 Parameter 元素的定义。
<Parameters>
<Parameter Direction="In" Name="name">
<TypeDescriptor TypeName="System.String"
AssociatedFilter="Name" Name="name" />
</Parameter>
<Parameter Direction="In" Name="limit">
<TypeDescriptor TypeName="System.Int32"
AssociatedFilter="Limit" Name="limit" />
</Parameter>
<Parameter Direction="Return" Name="Customers">
<TypeDescriptor TypeName="SampleWebServiceProxy.Customer[],
SampleWebService" IsCollection="true" Name="ArrayOfCustomer">
<TypeDescriptors>
<TypeDescriptor TypeName="SampleWebServiceProxy.Customer,
SampleWebService" Name="Customer">
<TypeDescriptors>
<TypeDescriptor TypeName="System.String"
IdentifierName="CustomerID" Name="CustomerID" />
<TypeDescriptor TypeName="System.String" Name="Name" />
<TypeDescriptor TypeName="System.Int64"
Name="WorkPhoneNumber" />
<TypeDescriptor TypeName="System.Int64"
Name="MobilePhoneNumber" />
<TypeDescriptor TypeName="System.String" Name="Industry" />
<TypeDescriptor TypeName="System.String" Name="WebSite" />
</TypeDescriptors>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
</Parameter>
</Parameters>