Recensement des types non scalaires
Remonter à Utilisation de types non scalaires dans des interfaces invocables
Pour qu'une interface invocable puisse utiliser des types autres que les types scalaires prédéfinis énumérés dans Utilisation de types non scalaires dans des interfaces invocables, l'application doit avoir recensé le type à l'aide du registre des types distants. Pour accéder à ce registre, vous devez ajouter l'unité InvokeRegistry à votre clause uses. Cette unité déclare une fonction globale, RemTypeRegistry, qui renvoie une référence au registre des types distants.
Le registre des types distants dispose de deux méthodes pour recenser les types :RegisterXSInfo et RegisterXSClass. La première RegisterXSInfo) vous permet de recenser un tableau dynamique ou une autre définition de type. La deuxième (RegisterXSClass) concerne le recensement des classes distantes que vous définissez pour représenter d'autres types.
Si vous utilisez des tableaux dynamiques ou des types énumérés, le registre d'invocation peut obtenir les informations dont il a besoin à partir des informations de type générées par le compilateur. Par exemple, votre interface peut utiliser un type comme celui-ci :
type TDateTimeArray = array of TXSDateTime;
typdef DynamicArray<TXSDateTime> TDateTimeArray;
Ce type est automatiquement recensé lorsque vous recensez l'interface invocable. Toutefois, si vous voulez spécifier l'espace de nommage dans lequel le type est défini ou bien le nom du type, vous devez ajouter du code pour recenser explicitement le type à l'aide de la méthode RegisterXSInfo du registre des types distants.
Le recensement figure dans la section initialisation de l'unité dans laquelle vous déclarez ou utilisez le tableau dynamique :
RemTypeRegistry.RegisterXSInfo(TypeInfo(TDateTimeArray), MyNameSpace, 'DTarray', 'DTarray');
void RegTypes() { RemTypeRegistry()->RegisterXSInfo(__arraytypeinfo(TDateTimeArray), MyNameSpace, "DTarray", "DTarray"); InvRegistry()->RegisterInterface(__delphirtti(ITimeServices)); }
Le premier paramètre de RegisterXSInfo comprend les informations de type concernant le type que vous êtes en train de recenser. Le deuxième paramètre est l'URI de l'espace de nommage dans lequel le type est défini. Si vous omettez ce paramètre ou spécifiez une chaîne vide, le registre génère un espace de nommage à votre place. Le troisième paramètre est le nom du type tel qu'il apparaît dans le code natif. Si vous omettez ce paramètre ou spécifiez une chaîne vide, le registre extrait le nom du type des informations de type fournies comme premier paramètre. Le dernier paramètre est le nom du type tel qu'il apparaît dans les documents WSDL. Si vous omettez ce paramètre ou spécifiez une chaîne vide, le registre utilise le nom de type natif (le troisième paramètre).
L'enregistrement d'une classe distante est similaire, mis à part que vous fournissez une référence de classe au lieu d'un pointeur d'informations de type. Par exemple, la ligne suivante provient de l'unité XSBuiltIns. Elle recense TXSDateTime, un descendant de TRemotable qui représente des valeurs TDateTime :
RemClassRegistry.RegisterXSClass(TXSDateTime, XMLSchemaNameSpace, 'dateTime', ,True);
void RegTypes() { RemTypeRegistry()->RegisterXSclass(__classid(TXSDateTime), XMLSchemaNameSpace, "dateTime", "", true); InvRegistry()->RegisterInterface(__delphirtti(ITimeServices)); }
Le premier paramètre est la référence de classe de la classe distante qui représente le type. Le deuxième est un identificateur de ressource uniforme (URI) qui identifie de manière unique l'espace de nommage de la nouvelle classe. Si vous spécifiez une chaîne vide, le registre génère un URI à votre place. Les troisième et quatrième paramètres spécifient les noms natif et externe du type de données représenté par votre classe. Si vous omettez le quatrième paramètres, le registre des types utilise le troisième paramètre pour les deux valeurs. Si vous spécifiez une chaîne vide pour les deux paramètres, le registre utilise le nom de la classe. Le cinquième paramètre indique si la valeur des instances de classe peut être transmise sous forme d'une chaîne. Vous pouvez ajouter un sixième paramètre facultatif (non présenté ici) pour contrôler la manière dont plusieurs références à la même instance d'objet doivent être représentées dans les paquets SOAP.