TypeDescriptor

每个 Parameter 对象都具有一个定义了参数的数据类型的 TypeDescriptor 对象。它是最复杂的元数据对象,是一种递归描述由基元构建的抽象数据结构的层次结构对象。此外,TypeDescriptor 树的叶节点指向由 MethodInstance 对象指定的一组可能的默认值。因此,给定一个 MethodInstance 对象和参数,该参数的 TypeDescriptor 对象将是实例化该参数的默认值的一种方法。

TypeDescriptors in Input Parameters

输入 TypeDescriptor 的 IdentifierName 属性将向业务数据目录发送信号,要求其在执行方法前插入相关实体实例的标识符值。例如,如果这是 SpecificFinderMethodInstance 的一部分,则用户可能已提供了要检索的实体实例的标识符值。业务数据目录在使用所有默认值实例化该参数后将该值插入该槽。

输入 TypeDescriptor 的 AssociatedFilter 属性将向业务数据目录发送信号,要求其在实例化参数后和执行方法前插入用户或系统所提供的值。例如,如果这是 FinderMethodInstance 的一部分,则用户可能已提供与该方法关联的某些或所有筛选器的值。这些值将在执行方法前插入标记的槽中。

TypeDescriptors in Return Parameters

  • 对于数据库系统,返回参数的根 TypeDescriptor 对象始终设置了 IsCollection 标记。这是因为所有数据库输出内容都是记录流,无论其语义环境为何,即无论其是单个记录 (SpecificFinder/ViewAccessor) 还是多个记录 (Finder) 都如此。

    数据库系统将模型化为记录流。因此,根 TypeDescriptor 将作为流,下一级 TypeDescriptor 将作为记录。即使记录是列的集合,也不会设置 IsCollection 标记,原因是我们希望业务数据目录将其作为强类型字段的结构。

  • 在 Web 服务系统中,请在返回 TypeDescriptor 对象上使用 IsCollection 标记,以指明返回参数中包含集的位置。可以考虑用于返回客户集的 WebMethod 对象,其中每个客户包含地址集。在此示例中,必须设置标记两次 — 根Customer[] 级别设置一次,Customer[0].Address[] 级别再设置一次。但是,TypeDescriptor 集下只能有一个代表集结构的子 TypeDescriptor 对象。

返回参数中的 TypeDescriptor 对象代表由业务数据目录构造并返回给用户以显示或模拟的 IEntityInstance 接口的字段。IEntityInstance 接口提供了抽象访问实例的字段和标识符值的机制。标识符值在 IEntityInstance 接口中显示用于直接访问,因此必须标识实际提供了这些值的 TypeDescriptor 对象。可通过以 IdentifierName 属性标记输出/返回 TypeDescriptor 对象来实现。

TypeDescriptors in Associations

AssociationMethodInstance 对象在源实体实例的标识符值的输入中包含多个槽,在目标实体实例的标识符值的输出中包含一个槽。因此,必须以 Association 方法中作为关联源的每个实体的标识符的相关标识符来标识足够多的输入 TypeDescriptor 对象。输入 TypeDescriptor 对象的 IdentifierName 属性将向业务数据目录发送信号,要求其在执行方法前插入相关实体实例的标识符值。例如,在 AssociationMethodInstance 中,用户可能已提供了要检索的源实体实例的标识符值。业务数据目录在使用所有默认值完全实例化该参数后将该值插入该槽。

示例

说明

以下示例演示了返回实体实例集的简单参数和较复杂的返回参数。最后一个示例演示了用于 DataSet 从 Web 方法所返回的代码的一个参数。

代码

简单参数

<Parameter Direction="In" Name="@minCustId">
   <TypeDescriptor TypeName="System.Int32" 
   IdentifierName="CustomerID" AssociatedFilter="ID" Name="minCustId">
      <DefaultValues>
         <DefaultValue MethodInstanceName="CustFinderInstance" 
         Type="System.Int32">0</DefaultValue> 
      </DefaultValues>
   </TypeDescriptor>
</Parameter>

复杂参数

<Parameter Direction="Return" Name="Customers">
   <TypeDescriptor TypeName="System.Data.IDataReader, System.Data, 
   Version=2.0.3600.0, Culture=neutral, 
   PublicKeyToken=b77a5c561934e089" IsCollection="true" 
   Name=" CustomerDataReader">
      <TypeDescriptors>
         <TypeDescriptor TypeName="System.Data.IDataRecord, 
         System.Data, Version=2.0.3600.0, Culture=neutral, 
         PublicKeyToken=b77a5c561934e089" Name="CustomerDataRecord">
            <TypeDescriptors>
                <TypeDescriptor TypeName="System.Int32" 
                 IdentifierName="IndividualID" Name="IndividualID">
                 <LocalizedDisplayNames>
                    <LocalizedDisplayName LCID="1033">ID
                    </LocalizedDisplayName> 
                 </LocalizedDisplayNames>
               </TypeDescriptor>
               <TypeDescriptor TypeName="System.String" 
                 Name="FirstName">
                <Properties>
                  <Property Name="DisplayByDefault" 
                  Type="System.Boolean">true</Property> 
                </Properties>
            </TypeDescriptor>
            <TypeDescriptor TypeName="System.String" Name="LastName">
              <Properties>
                <Property Name="DisplayByDefault" 
                Type="System.Boolean">true</Property> 
              </Properties>
             </TypeDescriptor>
            </TypeDescriptors>
         </TypeDescriptor>
      </TypeDescriptors>
   </TypeDescriptor>
</Parameter>

DataSet

<Parameter Direction="Return" Name="Customers">
<TypeDescriptor Name=""DataSet"" TypeName=""System.Data.DataSet, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"">
                                                <TypeDescriptors>
                                                    <TypeDescriptor Name=""Tables"" TypeName=""System.Data.DataTableCollection, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" IsCollection=""true"">
                                                        <TypeDescriptors>
                                                            <TypeDescriptor Name=""Table"" TypeName=""System.Data.DataTable, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" >
                                                                <TypeDescriptors>
                                                                    <TypeDescriptor Name=""Rows"" TypeName=""System.Data.DataRowCollection, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"" IsCollection=""true"">
                                                                        <TypeDescriptors>
                                                                            <TypeDescriptor Name=""DataRow"" TypeName=""System.Data.DataRow, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"">
                                                                                <TypeDescriptors>
                                                                                    <TypeDescriptor Name=""field1"" TypeName=""System.String"" IdentifierName=""f1"" />
                                                                                    <TypeDescriptor Name=""field2"" TypeName=""System.String"" />
                                                                                    <TypeDescriptor Name=""field3"" TypeName=""System.String"" />
                                                                                </TypeDescriptors>
                                                                            </TypeDescriptor>
                                                                        </TypeDescriptors>
                                                                    </TypeDescriptor>
                                                                </TypeDescriptors>
                                                            </TypeDescriptor>
                                                        </TypeDescriptors>
                                                    </TypeDescriptor>
                                                </TypeDescriptors>
                                            </TypeDescriptor>
</Parameter>

架构

子级

类型

出现规律

默认值

限制/接受的值

说明

TypeName

属性 (String)

1..1

最小长度:1

最大长度:255

LOB 系统的类型系统中由 TypeDescriptor 对象所描述的类型的名称。

与此 TypeDescriptor 对象的 Parameter 对象关联的ITypeReflector,负责将 LOB 系统类型解析为 .NET 类型。

在 Web 服务和数据库 (ADO.NET) 情况下,“LOB 系统类型系统”均为 .NET Type System,因此 TypeName 的值是 .NET 类型名称。

IdentifierName

属性 (String)

0..1

此 TypeDescriptor 对象所代表的标识符的名称。

如果此 TypeDecsriptor 对象描述 SpecificFinder 方法的输入参数,则在调用 FindSpecific 方法时将以标识符值填充该参数。

如果此 TypeDescriptor 对象描述 Finder 或 SpecificFinder 方法的输出参数,则在调用 FindFiltered 或 FindSpecific 时该参数的值将包括在返回的实体实例的标识符值集内。

IdentifierEntityName

属性 (String)

0..1

包含此 TypeDescriptor 对象的实体

包含此 TypeDescriptor 对象所代表的标识符的实体的名称。

将关联模型化为源实体上的方法时,IdentifierEntityName 是必需的。在这种情况下,源实体将返回目标实体的实例,因此必须将 IdentifierEntityName 属性设置成目标实体的名称。

AssociatedFilter

属性 (String)

0..1

每个 FilterDescriptor 对象的 TypeDescriptor 对象的最多个数:10

与此 TypeDescriptor 对象关联的筛选器的名称。

IsCollection

属性 (Boolean)

0..1

false

指定 TypeDescriptor 对象是否代表集。如果值为 true,则 TypeDescriptor 必须包含一个描述集内的元素的子 TypeDescriptor。

Finder 方法的返回参数必须包含一个 IsCollection = true 的 TypeDescriptor。

DefaultValues

元素

0..1

每个 TypeDescriptor 的最大默认值:10

DefaultValue 的容器元素。

TypeDescriptors

元素

0..1

每个 TypeDescriptor 对象的 TypeDescriptor 对象的最多个数:300

TypeDescriptor 的容器元素。

属性

TypeDescriptor 对象在返回参数字段中接受以下属性。

重要

属性区分大小写。

属性

类型

必需

默认值

限制/

接受的值

注释

ShowInPicker

System.Boolean

false

true

false

如果在返回参数的字段中将此属性设置为 true,则业务数据选取器中会显示该字段。业务数据目录显示定义了“ShowInPicker”属性的所有字段,以及业务数据选取器中的标题字段。如果没有此类字段,则它只显示标识符字段。

See Also

任务

AdventureWorks SQL Server 2000 示例

如何:初步使用运行时对象模型

如何:管理对象模型使用入门

概念

常见问题解答:业务数据目录

业务数据目录:术语表