delphimvcframework/sources/MVCFramework.ApplicationSession.pas

162 lines
4.1 KiB
ObjectPascal
Raw Normal View History

2013-10-30 00:48:23 +01:00
unit MVCFramework.ApplicationSession;
interface
uses System.SysUtils, System.Generics.Collections;
type
TWebApplicationSession = class abstract
strict protected
function GetItems(const Key: string): string; virtual; abstract;
procedure SetItems(const Key, Value: string); virtual; abstract;
public
constructor Create; virtual;
destructor Destroy; override;
function ToString: string; override;
property Items[const Key: string]: string read GetItems
write SetItems; default;
end;
TWebApplicationSessionClass = class of TWebApplicationSession;
TWebApplicationSessionMemory = class(TWebApplicationSession)
strict protected
FData: TDictionary<string, string>;
function GetItems(const Key: String): String; override;
procedure SetItems(const Key, Value: String); override;
public
function ToString: String; override;
constructor Create; override;
destructor Destroy; override;
end;
TMVCApplicationSessionFactory = class sealed
protected
FRegisteredApplicationSessionTypes: TDictionary<String, TWebApplicationSessionClass>;
class var FInstance: TMVCApplicationSessionFactory;
constructor Create;
public
procedure RegisterSessionType(AName: String; AWebApplicationSessionClass: TWebApplicationSessionClass);
class function GetInstance: TMVCApplicationSessionFactory;
function CreateNewByType(AName: String): TWebApplicationSession;
2015-04-01 17:01:23 +02:00
destructor Destroy; override;
2013-10-30 00:48:23 +01:00
end;
implementation
uses
System.dateutils;
constructor TWebApplicationSession.Create;
begin
inherited Create;
end;
destructor TWebApplicationSession.Destroy;
begin
inherited;
end;
function TWebApplicationSession.ToString: string;
begin
Result := '';
end;
constructor TWebApplicationSessionMemory.Create;
begin
inherited;
FData := TDictionary<string, string>.Create;
end;
destructor TWebApplicationSessionMemory.Destroy;
begin
FData.Free;
inherited;
end;
function TWebApplicationSessionMemory.GetItems(const Key: String): String;
begin
TMonitor.Enter(self);
try
if not FData.TryGetValue(Key, Result) then
Result := '';
finally
TMonitor.Exit(self);
end;
end;
procedure TWebApplicationSessionMemory.SetItems(const Key, Value: String);
begin
TMonitor.Enter(self);
try
FData.AddOrSetValue(Key, Value);
finally
TMonitor.Exit(self);
end;
end;
function TWebApplicationSessionMemory.ToString: String;
var
Key: String;
begin
TMonitor.Enter(self);
try
Result := '';
for Key in FData.Keys do
begin
Result := Key + ' = ' + QuotedStr(FData.Items[Key]) + sLineBreak;
end;
finally
TMonitor.Exit(self);
end;
end;
{ TMVCSessionManager }
constructor TMVCApplicationSessionFactory.Create;
begin
inherited;
FRegisteredApplicationSessionTypes := TDictionary<string, TWebApplicationSessionClass>.Create;
end;
function TMVCApplicationSessionFactory.CreateNewByType(AName: String): TWebApplicationSession;
var
clazz: TWebApplicationSessionClass;
begin
if not FRegisteredApplicationSessionTypes.TryGetValue(AName, clazz) then
raise Exception.Create('Unknown application session type');
Result := clazz.Create;
end;
destructor TMVCApplicationSessionFactory.Destroy;
begin
FRegisteredApplicationSessionTypes.Free;
inherited;
end;
class
function TMVCApplicationSessionFactory.GetInstance: TMVCApplicationSessionFactory;
begin
if not Assigned(FInstance) then // doesnt require double-check because used for the first time at the unit initialization
FInstance := TMVCApplicationSessionFactory.Create;
Result := FInstance;
end;
procedure TMVCApplicationSessionFactory.RegisterSessionType(AName: String;
AWebApplicationSessionClass: TWebApplicationSessionClass);
begin
FRegisteredApplicationSessionTypes.AddOrSetValue(AName, AWebApplicationSessionClass);
end;
initialization
TMVCApplicationSessionFactory.GetInstance.RegisterSessionType('memory', TWebApplicationSessionMemory);
finalization
TMVCApplicationSessionFactory.FInstance.Free;
end.