Der Aspekt4Delphi besteht aus einer Bibliothek, die die Verwendung des Konzepts der Aspekt-orientierten Programmierung (AOP) in Delphi ermöglicht.
AOP ist ein Programmierungsparadigma, das darauf abzielt, die Modularität zu erhöhen, indem die Trennung von Kreuzungsbedenken ermöglicht wird. Dies geschieht, indem Sie dem vorhandenen Code zusätzliches Verhalten ohne Änderung des Code selbst hinzufügen. Stattdessen können wir diesen neuen Code und diese neuen Verhaltensweisen separat deklarieren.
Aspekt4Delphi hilft uns bei der Umsetzung dieser interkürzenden Bedenken.
Um eine lokale Kopie in Betrieb zu nehmen, befolgen Sie diese einfachen Schritte.
Um diese Bibliothek zu verwenden, ist eine aktualisierte Version von Delphi IDE (xe oder höher) erforderlich.
Klonen Sie das Repo
git clone https://github.com/ezequieljuliano/Aspect4Delphi.git
Fügen Sie den "Suchpfad" Ihrer IDE oder Ihr Projekt die folgenden Verzeichnisse hinzu:
Aspect4Delphisrc
Um das Aspekt -Orientierungsparadigma in Ihrem Projekt mit Aspekt4Delphi zu liefern, benötigen Sie:
Um die Verwendung zu veranschaulichen, schauen wir uns eine Lösung zum Verwalten von Protokollen einer Anwendung an.
Implementieren Sie ein Pointcut -Attribut (vorzugsweise vererbt von AspektAttribute):
interface
uses
Aspect.Core;
type
LoggingAttribute = class(AspectAttribute)
private
{ private declarations }
protected
{ protected declarations }
public
{ public declarations }
end;
implementation
end.
Implementieren Sie die Klasse, die Ihren Aspekt darstellt und die Ratschläge enthält (Sie müssen die IASspekt -Schnittstelle implementieren):
interface
uses
System.SysUtils,
System.Rtti,
Aspect,
Aspect.Core,
Logging.Attribute,
App.Context;
type
ELoggingAspectException = class(Exception)
private
{ private declarations }
protected
{ protected declarations }
public
{ public declarations }
end;
TLoggingAspect = class(TAspectObject, IAspect)
private
{ private declarations }
protected
procedure OnBefore(
instance: TObject;
method: TRttiMethod;
const args: TArray<TValue>;
out invoke: Boolean;
out result: TValue
); override;
procedure OnAfter(
instance: TObject;
method: TRttiMethod;
const args: TArray<TValue>;
var result: TValue
); override;
procedure OnException(
instance: TObject;
method: TRttiMethod;
const args: TArray<TValue>;
out raiseException: Boolean;
theException: Exception;
out result: TValue
); override;
public
{ public declarations }
end;
implementation
{ TLoggingAspect }
procedure TLoggingAspect.OnAfter(instance: TObject; method: TRttiMethod;
const args: TArray<TValue>; var result: TValue);
var
attribute: TCustomAttribute;
begin
inherited;
for attribute in method.GetAttributes do
if attribute is LoggingAttribute then
begin
LoggingFile.Add('After the execution of ' +
instance.QualifiedClassName + ' - ' +
method.Name
);
Break;
end;
end;
procedure TLoggingAspect.OnBefore(instance: TObject; method: TRttiMethod;
const args: TArray<TValue>; out invoke: Boolean; out result: TValue);
var
attribute: TCustomAttribute;
begin
inherited;
for attribute in method.GetAttributes do
if attribute is LoggingAttribute then
begin
LoggingFile.Add('Before the execution of ' +
instance.QualifiedClassName + ' - ' +
method.Name
);
Break;
end;
end;
procedure TLoggingAspect.OnException(instance: TObject; method: TRttiMethod;
const args: TArray<TValue>; out raiseException: Boolean;
theException: Exception; out result: TValue);
var
attribute: TCustomAttribute;
begin
inherited;
for attribute in method.GetAttributes do
if attribute is LoggingAttribute then
begin
LoggingFile.Add('Exception in executing ' +
instance.QualifiedClassName + ' - ' +
method.Name + ' - ' +
theException.Message
);
Break;
end;
end;
end.
Registrieren Sie Ihr Pointcut -Attribut und seine Aspektklasse im Kontext (halten Sie diesen Kontext in Singleton -Instanz vorzugsweise):
interface
uses
Logging.Aspect;
Aspect.Context;
function AspectContext: IAspectContext;
implementation
var
AspectContextInstance: IAspectContext = nil;
function AspectContext: IAspectContext;
begin
if (AspectContextInstance = nil) then
begin
AspectContextInstance := TAspectContext.Create;
AspectContextInstance.RegisterAspect(TLoggingAspect.Create);
end;
Result := AspectContextInstance;
end;
end.
Verwenden Sie in Ihrer Geschäftsregel -Klasse das Attribut, um Ihre Verbindungspunkte zu definieren. Sie können den Konstruktor und den Destruktor verwenden, um Ihre Klasse im Weber hinzuzufügen.
interface
uses
System.SysUtils,
Logging.Attribute,
App.Context;
type
EWhatsAppMessageException = class(Exception)
private
{ private declarations }
protected
{ protected declarations }
public
{ public declarations }
end;
TWhatsAppMessage = class
private
{ private declarations }
protected
{ protected declarations }
public
constructor Create;
destructor Destroy; override;
[Logging]
procedure Send; virtual;
end;
implementation
{ TWhatsAppMessage }
constructor TWhatsAppMessage.Create;
begin
inherited Create;
AspectContext.Weaver.Proxify(Self);
end;
destructor TWhatsAppMessage.Destroy;
begin
AspectContext.Weaver.Unproxify(Self);
inherited Destroy;
end;
procedure TWhatsAppMessage.Send;
begin
//Execution of send.
end;
In den offenen Problemen finden Sie eine Liste der vorgeschlagenen Merkmale (und bekannten Probleme).
Beiträge machen die Open -Source -Community zu einem erstaunlichen Ort, um zu lernen, zu inspirieren und zu kreieren. Alle Beiträge, die Sie leisten, werden sehr geschätzt .
git checkout -b feature/AmazingFeature ).git commit -m 'Add some AmazingFeature' )git push origin feature/AmazingFeature ) Unter der Apache -Lizenz verteilt. Weitere Informationen finden Sie LICENSE .
Um uns zu kontaktieren, verwenden Sie die Optionen:
https://github.com/ezequieljuliano/aspect4delphi