AX2012: Metadata service

Dynamics AX 2012 nabízí dalším programům přístup ke svým aplikačním metadatům (jako jsou informace o datových typech, tabulkách, labelech atd.) pomocí WCF služeb. Toto řešení má oproti přístupu přes Business Connector řadu výhod, například v oblasti zabezpečení, konfigurace nebo při volání z ne-NET. aplikací.

Způsob použití metadata service je velmi dobře popsán na MSDN, což vřele doporučuji nastudovat (viz odkazy níže). Já se zde podělím jen o další ukázku obdobnou těm na MSDN.

Implementace .NET aplikace využívající metadata service se skládá z několika jednoduchých kroků:

  1. Vytvoření projektu ve Visual Studiu.
  2. Přidání reference na službu. WSDL pro metadata service se (defaultně) nachází na adrese ve formátu http://servername:8101/DynamicsAx/Services/MetadataService – pro virtuální prostředí AX2012 Beta tedy platí adresa http://AX5-W8R2-01:8101/DynamicsAx/Services/MetadataService.
    Přidáním reference se aktivuje magie Visual Studia a na pozadí se vygenerují proxy třídy, konfigurační soubory atd.
  3. Vytvoření instance klienta a zavolání potřebné operace (=metody).

Následující ukázka představuje konzolovou miniaplikaci, která k  zadaném ID labelu vrátí text labelu (ve výchozím jazyce). Konzolová aplikace je použita jen pro názornost, v praxi by podobnou logiku mohla interně volat nějaká rozsáhlejší aplikace.

using System;
using System.Text.RegularExpressions;
using AxMetadataServiceTest.MetadataServiceReference;
 
namespace AxMetadataServiceTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Zadejte ID labelu: ");
            string labelId = Console.ReadLine();
 
            if (Regex.IsMatch(labelId, @"^@[a-zA-Z]{3}\d+$"))
            {
                var client = new AxMetadataServiceClient();
 
                try
                {
                    LabelMetadata labelMetadata = client.GetLabelMetadataById(new string[] { labelId })[0];
 
                    if (labelMetadata.LabelString == labelId)
                    {
                        Console.WriteLine("Label {0} nebyl nalezen", labelId);
                    }
                    else
                    {
                        Console.WriteLine("{0}: {1}", labelId, labelMetadata.LabelString);
                    }
                    client.Close();
                }
                catch
                {
                    client.Abort();
                    throw;
                }
            }
            else
            {
                Console.WriteLine("Neplatný formát ID labelu");
            }
        }
    }
}

Několik málo komentářů k tomuto programu:

  • Názvy jmenných prostorů závisí na vaší volbě, tudíž se mohou lišit.
  • Ačkoli třída AxMetadataServiceClient (resp. její předek ClientBase) implementuje IDisposable, měli byste raději volat Close() / Abort() než použít příkaz using. Metoda Dispose() totiž volá metodu Close() a ta může vyvolat výjimku, což představuje potenciální problém. (Tahle ne úplně šťastná implementace má své historické důvody.)
  • Pokud je zadáno neexistující ID labelu, GetLabelMetadataById() kupodivu nevyhodí výjimku ani nevrátí null (jako prvek pole), nýbrž vrátí instanci, která ve má všech vlastnostech ono zadané (neexistující) ID. Proto detekuji neexistující labely podmínkou if (labelMetadata.LabelString == labelId).

Užitečné odkazy:

MSDN: Metadata Service
MSDN Walkthrough: Calling the Metadata Service
MSDN Walkthrough: Using the Metadata Service to Get Table Field Labels
Diskuse o Dispose() v ClientBase