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;
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); 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