Delphi MVC FrameworkMathias Pannier
Über mich
• Name: Mathias Pannier
• Position: Softwareentwickler/Teamleiter
• Mehr als 15 Jahre Erfahrung mit Softwareentwicklung in Delphi
• Blog: mathiaspannier.wordpress.com
mathiaspannier.wordpress.com
DMVCFramework
• Delphi MVC Framework - is a powerful framework for web solution in Delphi (Quelle: https://code.google.com/p/delphimvcframework/)
• Delphi Units für die Entwicklung von Web Diensten (REST Server/Clients)
• Website: https://github.com/danieleteti/delphimvcframework
• Supportsite: https://www.facebook.com/groups/delphimvcframework
mathiaspannier.wordpress.com
DMVCFramework
• Hauptentwickler und Initiator ist Daniele Teti (http://www.danieleteti.it - Autor von Delphi Cookbook)
• Im Delphi Cookbook gibt es einige Abschnitte über das DMVCFramework
• Derzeit 4 Entwickler
• Erster Stand in einem öffentlichen Repository vom 29.10.2013
• Letztes update vor ein paar Tagen (Januar 2016)
• läuft ab Delphi XE3 aufwärts
mathiaspannier.wordpress.com
Features
• Simple to use (really)
• RESTful (RMM Level 3) compliant
• Fancy URL with parameter mappings**
• Specialized renders to generate text, html, json**
• Powerful mapper to map json to objects and datasets to objects**
• Can be packaged as stand alone server, apache module (XE6 or better) and ISAPI dll
mathiaspannier.wordpress.com
Features
• Integrated RESTClient
• Messaging extension using STOMP
• Load balancing and cache using REDIS
• It use Embarcadero WebBroker but is not tied to it
• Designed with services and web client app in mind
• Server side generated pages using Mustache (in the past eLua)
• Uvm.
• Quelle: https://github.com/danieleteti/delphimvcframework und https://github.com/danieleteti/delphimvcframework/blob/master/docs/ITDevCON%202013%20-%20Introduction%20to%20DelphiMVCFramework.pdf
mathiaspannier.wordpress.com
mathiaspannier.wordpress.com
REST
• Representational State Transfer bezeichnet ein Programmierparadigma für verteilte Systeme, insbesondere für Webservices ... REST hat das Ziel einen Architekturstil zu schaffen, der besser die Anforderungen des modernen Web darstellt …
• Prinzipien: Client-Server, Zustandslosigkeit, (HTTP) Caching, einheitliche Schnittstelle (URL, HTTP Verben, JSON, HATEOAS –Navigation über URLs), mehrschichtige Systeme
• Quelle: https://de.wikipedia.org/wiki/Representational_State_Transfer
mathiaspannier.wordpress.com
Architektur
• eine Anwendung (EXE oder ISAPI DLL)
• mehrere Controller (TMVCController)
• mehrere Aktionen pro Controller (Methoden)
• Controller, Aktionen und deren Parameter sind Bestandteil der URL die aufgerufen wird
• www.myserver.com/blog/posts/123
mathiaspannier.wordpress.com
1. Beispiel - Delphi WebBroker Anwendung (ISAPI/EXE)
typeTWebModule1 = class(TWebModule)
procedure WebModuleCreate(Sender: TObject);private
DMVC: TMVCEngine;end;
procedureTWebModule1.WebModuleCreate(Sender: TObjec t);begin
DMVC := TMVCEngine.Create(self);DMVC.AddController(TBlogController);
end;
mathiaspannier.wordpress.com
1. Beispiel – Der Controllertype
[MVCPath('/blog')]
TBlogController = class(TMVCController)
public
[MVCPath('/posts/($id)')]
procedure GetPostByID(CTX: TWebContext);
end;
implementation
procedure TBlogController.GetPostByID(CTX: TWebContext);
var
aBlogPost: TBlogPost;
begin
aBlogPost := LoadFromDataBaseByID(CTX.Request.Parameters['id'].ToInteger);
Render(aBlogPost);
end;
mathiaspannier.wordpress.com
Parameter
• CTX.Request.Params['id']
• URL Parameter
• Query String Parameter
• Form Parameter (HTML Form Submit)
• Cookie Felder
• Bsp.: • www.myserver.com/blog/posts/123
• www.myserver.com/blog/posts?id=123
mathiaspannier.wordpress.com
Renderer
• Methoden des Controllers um den Response (Stream) zu“produzieren”
• Sie setzen den HTTP Status Code und den Content Type
• Verfügbare Renderer
• Text, DataSets, JSONValues, Delphi Objects, List of Delphi Objects, Exceptions, HTML pages using Mustache, Raw Streams
mathiaspannier.wordpress.com
Renderer Beispielprocedure TBlogController.GetPostByID(CTX: TWebConte xt);
var
aBlogPost: TBlogPost;
begin
aBlogPost := TBlogPost.Create;
aBlogPost.ID := CTX.Request.Parameters['id'].ToInte ger;
aBlogPost.Title := 'Hallo Welt';
aBlogPost.Body := 'Dies ist ein Test';
aBlogPost.CreateDate := Now();
aBlogPost.Author := 'Mathias Pannier';
Render(aBlogPost);
end;
procedure TBlogController.GetPostByID(CTX: TWebConte xt);
begin
DataSet1.SelectSQL.Add('select * from BLOG_POSTS wher e ID = :ID');
DataSet1.Params[0].AsInteger := CTX.Request.Paramete rs['id'].ToInteger;
DataSet1.Open;
Render(DataSet1);
end;
mathiaspannier.wordpress.com
Mapper
• "Konverter" für Delphi Objekte, JSon und DataSets
• Bsp.:
• ObjectToJSONObject
• JSONObjectToObject
• DataSetToJSONArray
• JSONArrayToDataSet
• ...
• Können auch unabhängig vom Web - Framework verwendet werden
mathiaspannier.wordpress.com
Mapper Beispielprocedure TForm1.Button1Click(Sender: TObject);
var
aBlogPost: TBlogPost;
begin
aBlogPost := TBlogPost.Create;
aBlogPost.ID := 1;
aBlogPost.Title := 'Hallo Welt';
aBlogPost.Body := 'Dies ist ein Test';
aBlogPost.CreateDate := Now();
aBlogPost.Author := 'Mathias Pannier';
ShowMessage(Mapper.ObjectToJSONObjectString(aBlogPost));
aBlogPost.Free;
end;
mathiaspannier.wordpress.com
Demo
mathiaspannier.wordpress.com
Alternativen
• von Hand mit den Indy Komponenten
• DataSnap (Embarcadero; in Delphi integriert)
• mORMot Framework
• TMS XData
• kbmMW
• RemObjects
• Usw.
mathiaspannier.wordpress.com
Warum DMVC
• Leichtgewichtig, Klein, Schnell
• Einfach zu benutzen
• OpenSource
• "näher dran" an REST/Webentwicklung/HTTP
• Mapper/Renderer unabhängig nutzbar
• Performance und Stabilität von DataSnap ... (https://robertocschneiders.wordpress.com/2012/11/22/datasnap-analysis-based-on-speed-stability-tests/)
mathiaspannier.wordpress.com
Fragen?
mathiaspannier.wordpress.com