Ver Mensaje Individual
  #1  
Antiguo 17-05-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Reputación: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Datasnap, separando logica de acceso a datos

Que tal club, resulta que es la primera vez que me encamino en algo "serio" con Datasnap, estoy algo confundido

A grandes rasgos, esta seria mas o menos la forma de trabajar que venia usando hasta ahora:

Para cada objeto del dominio del negocio, encapsulaba toda la logica en una unit especifica para el, por ejemplo:

Código Delphi [-]
unit Productos;

interface

type
  TProducto = class
  public
    Id: int64;
    Descripcion: string;
    // bla bla mas campos
    function Guardar: boolean;
    class function Obtener(const Id: int64): TProducto;
  end

implementation

uses 
  UDataModule;

function TProducto.Guardar: boolean;
begin
  if Id = 0 then
    Result := DataModule.ProductMgr.Nuevo(Self)
  else
    Result := DataModule.ProductMgr.Actualizar(Self);
end;

class function TProducto.Obtener(const Id: int64): TProducto;
begin
  Result := DataModule.ProductMgr.Obtener(Id)
end;

Y ademas tambien generaba una unit especifica para controlar el acceso a datos, por ej:

Código Delphi [-]
unit ProductoMgr;

interface

type
  TProductoMgr = class
  public
    constructor Create(AConnection: TADOConnection);
    function Nuevo(const Producto: TProducto): boolean
    function Actualizar(const Producto: TProducto): boolean;
    function Obtener(const Id: int64): TProducto;
    function Buscar(const Descripcion: string): TDataSet;
  end;

Y luego en el clasico DataModule tenia que declarar en la seccion publica una instancia de cada uno de esos Mgr. En el evento AfterConnect de la Conexion los construia pasandoles como argumento la propia conexion

Bueno, ya se imaginan como funciona, es muy sencillo

Desde el cliente podria hacer cosas como

Código Delphi [-]
var 
  p: TProducto;
  IdRetornado: int64;
begin
  p := TProducto.Create;
  try
    p.Descripcion := 'Mi Producto';
    if p.Guardar then
    begin
      IdRetornado := p.Id;
      ShowMessage('Guardado correctamente'); 
    end else
      ShowMessage('Error');
  finally
    p.Free;
  end;
  
  p := TProducto.Obtener(IdRetornado);
  try
    ShowMessage(p.Descripcion); // 'Mi Producto'
  finally
    p.Free;
  end;
end;

Ahora bien, en datasnap es distinto. Entiendo las limitantes de que no puedo retornar directamente un objeto como mi TProducto, para eso deberia usar Json por ejemplo, esa no es mi duda

Lo que realmente quiero hacer es seguir con la idea de encapsular cada objeto en su unit especifica, pero datasnap requiere que publique cada metodo que los clientes van a invocar en el TServerMethods. Solamente quiero mantender "la casa en orden" y no tener en una sola unit (la del TServerMethods) todos los metodos y funciones que puedo invocar, mas bien me gustaria tener todo separadito y ordenadito en su lugar, me explico?

Existe alguna forma de hacer esto o hay que llenar una sola unit con todos los metodos?

Saludos
Responder Con Cita