TypeDescriptor クラス (Microsoft.Office.Server.ApplicationRegistry.Administration)
メソッドのパラメータのデータ型を定義します。
名前空間: Microsoft.Office.Server.ApplicationRegistry.Administration
アセンブリ: Microsoft.SharePoint.Portal (microsoft.sharepoint.portal.dll 内)
構文
'宣言
<SharePointPermissionAttribute(SecurityAction.InheritanceDemand, ObjectModel:=True)> _
<SharePointPermissionAttribute(SecurityAction.Demand, ObjectModel:=True)> _
Public Class TypeDescriptor
Inherits AccessControlledMetadataObject
'使用
Dim instance As TypeDescriptor
[SharePointPermissionAttribute(SecurityAction.InheritanceDemand, ObjectModel=true)]
[SharePointPermissionAttribute(SecurityAction.Demand, ObjectModel=true)]
public class TypeDescriptor : AccessControlledMetadataObject
備考
すべての Parameter オブジェクトには、パラメータのデータ型を定義する TypeDescriptor オブジェクトがあります。これは最も複雑なメタデータ オブジェクトで、基本要素で構成される抽象データ構造を再帰的に記述する階層オブジェクトです。また、TypeDescriptor ツリーの各末端ノードは、MethodInstance オブジェクトによって指定された既定値となりうるセットを指します。したがって、MethodInstance とパラメータが与えられた場合、パラメータの TypeDescriptor がそのパラメータの既定値をインスタンス化するための手段になります。
さらに、複雑なバックエンド API を Find、FindSpecific、CheckAccess などの単純な定型操作に変換するビジネス データ カタログ機能の中核を成すのも TypeDescriptor です。TypeDescriptor メタデータを使用して詳細な型情報を定義しておけば、TypeDescriptor にスロットのタグを付け、そこに識別子やフィルタ値をビジネス データ カタログでプラグインできます。たとえば、ある Parameter の TypeDescriptor に Entity の Identifier を受け取るようタグ付けすると、SpecificFinder として使用できる Method になります。
戻り値パラメータ内にコレクションがある場合にそれを示すようにするには、戻り値 TypeDescriptor オブジェクトに対して IsCollection プロパティを使用します。次のような Web メソッドを例にして考えてみましょう。このメソッドは顧客のコレクションを返しますが、それぞれの顧客には住所のコレクションが含まれます。この場合、フラグを 2 回設定する必要があります。ルートの Customer[] レベルで 1 回、そして Customer[0].Address[] レベルでもう 1 回です。しかし、コレクションの TypeDescriptor オブジェクトは、その下にコレクション内の構造を表す子 TypeDescriptor オブジェクトを 1 つしか持つことができません。
ビジネス データ Web パーツなどのビジネス データ カタログのクライアントは、複雑な構造を処理しません。たとえば、以下のような構造を考えてみてください。
class Customer { String Name; Address address; }
class Address { Street street; String city; String zip; }
class Street { int Block; String street; }
この制限を回避するために、ビジネス データ カタログは "複合書式" という概念をサポートします。クライアントでサポートされるのが基本要素のフラットな構造なので、ビジネス データ カタログは複雑な構造を書式付き文字列として "レンダリング" します。その方法には、単純な .NET Framework String フォーマッタを使用する方法と、.NET 言語を使用して作成するより複雑な Renderer を使用する方法の 2 とおりがあります。この方法を実現するには、それぞれに String プロパティ "FormatString" (e.g. "{0}, {1} \n {2}, {3}") または "RendererDefinition" (MyMethodName!MyTypeName, MyAssemblyName) を設定する必要があります。RendererDefinition の Method オブジェクトは、パブリックな .NET Type において、Objects 配列である 1 つの引数を取る .NET パブリック静的メソッドに対応していなければなりません。どちらの場合も、Format 文字列または .NET Renderer に渡されるのは、基本的に、ビジネス データ カタログの TypeDescriptor 定義によって複雑な構造をモデル化したときの、この構造の基本要素である子の値すべての配列です。
警告
複合書式は処理が遅いため、どうしても必要なときにだけ使用するようにしてください。
複合レンダリングを有効にするには、複合フィールドを含む構造に "ComplexFormatting" という制御プロパティが設定されていなければなりません。
注意
識別子はバックエンド アプリケーションへの入力と出力の両方に使用されるので、複合書式の識別子にタグ付けするときには注意してください。(顧客の住所を取得する場合、ビジネス データ カタログは GetAddressesForCustomer メソッドに渡す顧客キーを検索します)。識別子が書式付き文字列としてレンダリングされた場合は、すべての型情報が失われるため、入力としては使用できなくなります。
例
次のコード例は、AdventureWorks データベースの ProductModel エンティティ用の、メソッド インスタンス、フィルタ記述子、既定値、および型記述子を完備したメソッドを作成する方法を示しています。
Prerequisites
共有サービス プロバイダが既に作成されていることを確認します。
「[方法] 管理オブジェクト モデルを使用して LobSystem を作成する」に示すように、LOBSystem インスタンスを作成して接続パラメータを設定します。
「[方法] 管理オブジェクト モデルを使用してエンティティを作成する」に示すように、ProductModel エンティティを作成します。
コード内の定数値 EnterYourSSPNameHere を共有サービス プロバイダの名前に置き換えます。
Project References
このサンプルを実行する前に、コンソール アプリケーション コード プロジェクトに以下のプロジェクト参照を追加します。
Microsoft.SharePoint
Microsoft.SharePoint.Portal
Microsoft.Office.Server
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Office.Server.ApplicationRegistry.Administration;
using Microsoft.Office.Server.ApplicationRegistry.Infrastructure;
using WSSAdmin = Microsoft.SharePoint.Administration;
using OSSAdmin = Microsoft.Office.Server.Administration;
namespace Microsoft.SDK.SharePointServer.Samples
{
class GetStartedAndCreateSystem
{
const string yourSSPName ="EnterYourSSPNameHere";
static void Main(string[] args)
{
SetupBDC();
CreateFinderMethod();
Console.WriteLine("Press any key to exit...");
Console.Read();
}
static void SetupBDC()
{
SqlSessionProvider.Instance().SetSharedResourceProviderToUse(yourSSPName);
}
static void CreateFinderMethod()
{
LobSystemInstance mySysInstance = null;
LobSystemInstanceCollection sysInsCollection = ApplicationRegistry.Instance.GetLobSystemInstancesLikeName("AdventureWorksSampleFromCode");
foreach (LobSystemInstance sysInstance in sysInsCollection)
{
if (sysInstance.Name == "AdventureWorksSampleFromCode")
{
mySysInstance = sysInstance;
break;
}
}
EntityCollection entityColl = mySysInstance.LobSystem.Entities;
foreach (Entity entity in entityColl)
{
if (entity.Name == "ProductModel")
{
Method meth = entity.Methods.Create("GetProductModels", true, true);
meth.Properties.Add("RdbCommandText", "SELECT ProductModelID, Name, CatalogDescription FROM ProductModel WHERE Name LIKE @Name");
meth.Properties.Add("RdbCommandType", System.Data.CommandType.Text);
FilterDescriptor fd = meth.FilterDescriptors.Create("Name", true, "Microsoft.Office.Server.ApplicationRegistry.Runtime.WildcardFilter");
Parameter p1 = meth.Parameters.Create("@Name", true, Microsoft.Office.Server.ApplicationRegistry.MetadataModel.DirectionType.In, "Microsoft.Office.Server.ApplicationRegistry.Infrastructure.DotNetTypeReflector");
TypeDescriptor td1 = p1.CreateRootTypeDescriptor("Name", true, "System.String", null, fd, false);
Parameter p2 = meth.Parameters.Create("ProductModels", true, Microsoft.Office.Server.ApplicationRegistry.MetadataModel.DirectionType.Return, "Microsoft.Office.Server.ApplicationRegistry.Infrastructure.DotNetTypeReflector");
IList<Identifier> ids = new List<Identifier>(entity.Identifiers);
Identifier id = ids[0];
TypeDescriptor td2 = p2.CreateRootTypeDescriptor("ProductModelDataReader", true, "System.Data.IDataReader, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", null, null, true);
TypeDescriptor td21 = td2.ChildTypeDescriptors.Create("ProductModelDataRecord", true, "System.Data.IDataRecord, System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", null, null, false);
TypeDescriptor td210 = td21.ChildTypeDescriptors.Create("ProductModelID", true, "System.Int32", id, null, false);
TypeDescriptor td211 = td21.ChildTypeDescriptors.Create("Name", true, "System.String", null, null, false);
TypeDescriptor td212 = td21.ChildTypeDescriptors.Create("CatalogDescription", true, "System.String", null, null, false);
MethodInstance methInst1 = meth.MethodInstances.Create("ProductModelFinder", true, td2, Microsoft.Office.Server.ApplicationRegistry.MetadataModel.MethodInstanceType.Finder);
MethodInstance methInst2 = meth.MethodInstances.Create("ProductModelSpecificFinder", true, td2, Microsoft.Office.Server.ApplicationRegistry.MetadataModel.MethodInstanceType.SpecificFinder);
IList<MethodInstance> methInstCollection = new List<MethodInstance>(entity.MethodInstances);
td1.SetDefaultValue(methInstCollection[0].Id, "%");
td1.SetDefaultValue(methInstCollection[1].Id, "%");
Console.WriteLine("Created the finder method successfully.");
break;
}
}
}
}
}
継承階層
System.Object
Microsoft.Office.Server.ApplicationRegistry.Administration.MetadataObject
Microsoft.Office.Server.ApplicationRegistry.Administration.AccessControlledMetadataObject
Microsoft.Office.Server.ApplicationRegistry.Administration.TypeDescriptor
スレッドの安全性
この型のパブリックで静的な (Visual Basic では Shared) すべてのメンバは、スレッド セーフです。インスタンス メンバは、スレッド セーフであるとは保証されません。
関連項目
参照
TypeDescriptor メンバ
Microsoft.Office.Server.ApplicationRegistry.Administration 名前空間