规划步骤 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>

后续步骤

创作步骤 1:定义外部系统