Blog

All Blog Posts  |  Next Post  |  Previous Post

TMS XData está chegando

Monday, August 26, 2013

Uma nova framework chamada TMS XData está prestes a ser lançada pela TMS. É difícil definir uma framework com poucas palavras, especialmente se essa framework é modular e muitas partes dela podem ser usadas separadamente. Porém, usando uma definição bem abrangente, poderia dizer que TMS XData é uma framework que permite fornecer e consumir dados da sua aplicação através de serviços Rest. Mas talvez ao invés de tentar definir, o melhor é dar um exemplo

O XData pode ser bastante integrado ao TMS Aurelius, nossa framework ORM. Já postei aqui alguns artigos sobre o Aurelius com alguns exemplos simples. Sendo assim, caso você ainda não conheça o Aurelius, pode começar pelos primeiros passos, ou ainda, relacionado a este artigo, como criar associações simples.

Agora iremos criar um servidor XData bem simples que fornece objetos Aurelius:

program SimpleXDataServer;

{$APPTYPE CONSOLE}

uses
  Aurelius.Drivers.Interfaces,
  Aurelius.Engine.ObjectManager,
  XData.Http.Server,
  XData.Http.AureliusHandler,
  Utils,
  Customer;

procedure CreateCustomer(const CustomerName, CountryName: string);
var
  Manager: TObjectManager;
  Customer: TCustomer;
  Country: TCountry;
begin
  Manager := TObjectManager.Create(SQLiteConnection);
  Country := TCountry.Create;
  Country.Name := CountryName;
  Customer := TCustomer.Create;
  Customer.Name := CustomerName;
  Customer.Country := Country;
  Manager.Save(Customer);
  Manager.Free;
end;

var
  Conn: IDBConnection;
  Server: THttpServer;
begin
  ReportMemoryLeaksOnShutdown := true;
  Conn := SQLiteConnection;
  BuildDatabase(Conn);
  CreateCustomer('Paul', 'United States');
  CreateCustomer('Jonas', 'Germany');
  CreateCustomer('Hiroto', 'Japan');
  CreateCustomer('Jian', 'China');
  CreateCustomer('Sergei', 'Russia');

  Server := THttpServer.Create;
  Server.Port := 2001;
  Server.RegisterHandler(
    TAureliusHttpHandler.Create(
      'http://aurelius:2001/tms/xdata', SQLiteConnection));
  Server.Start;

  WriteLn('Running Simple XData Server');
  ReadLn;
  Server.Free;
  DestroyDatabase(Conn);
end.
O código acima usa as classes TCustomer e TCountry definidos no artigo sobre associações. São classes simples and não irei repetir o código aqui por simplicidade. Pelo mesmo motivo as construções try..finally que deveriam existir no código foram removidas.

O programa acima é uma aplicação "normal" usando TMS Aurelius, que conecta ao banco de dados, cria as tabelas necessárias e insere alguns dados. A parte diferente é a que cria uma instância de um THttpServer e registra um request handler no endereço "/tms/xdata". O que acontece aqui é que os objetos Aurelius estão agora sendo fornecidos através de uma API Rest bem definida.

O XData usa como default o protocolo OData, que permite uma grande compatibilidade com outros clientes e plataformas. Também permite que o XData faça muitas coisas automaticamente: os objetos TCustomer, por exemplo, estão disponíveis no endereço "http://aurelius:2001/tms/xdata/TCustomer" (Os nomes são configuráveis).

Outro ponto interessante é como os dados são facilmente acessíveis de qualquer lugar. Para ilustrar, apresento aqui o código completo de uma aplicação console .NET em C# que conecta ao servidor acima e obtém os objetos TCustomer, usando Linq:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Services.Client;

namespace DotNetClient
{
    class Program
    {
        static void Main(string[] args)
        {
            DataServiceContext context = new DataServiceContext(new Uri(@"http://aurelius:2001/tms/xdata"));
            IQueryable<TCustomer> customers = context.CreateQuery<TCustomer>("TCustomer");
            foreach (TCustomer customer in customers) 
                Console.WriteLine("Customer {0} from {1}", customer.FName, customer.FCountry.FName);
            Console.ReadLine();
        }
    }

    public class TCustomer
    {
        public int FId { get; set; }
        public string FName { get; set; }
        public TCountry FCountry { get; set; }
    }

    public class TCountry
    {
        public int FId { get; set; }
        public string FName { get; set; }
    }
}
Aqui está a saída dessa aplicação C#:



Mais informações em breve!



Wagner Landgraf




This blog post has not received any comments yet.



Add a new comment

You will receive a confirmation mail with a link to validate your comment, please use a valid email address.
All fields are required.



All Blog Posts  |  Next Post  |  Previous Post