Аспект4delphi состоит из библиотеки, которая позволяет использовать концепцию ориентированного на аспект программирования (AOP) в Delphi.
AOP-это парадигма программирования, которая направлена на увеличение модульности, позволяя разделить перекрестные проблемы. Это происходит путем добавления дополнительного поведения в существующий код без изменения самого кода. Вместо этого мы можем объявить этот новый код и это новое поведение отдельно.
Аспект4delphi помогает нам реализовать эти перекрестные проблемы.
Чтобы получить локальную копию и запуск, следуйте этим простым шагам.
Чтобы использовать эту библиотеку, требуется обновленная версия Delphi IDE (XE или выше).
Клонировать репо
git clone https://github.com/ezequieljuliano/Aspect4Delphi.git
Добавьте «путь поиска» вашего IDE или вашего проекта. Следующие каталоги:
Aspect4Delphisrc
Чтобы обеспечить парадигму ориентации аспектов в вашем проекте с аспектом4delphi, который вам нужен:
Чтобы проиллюстрировать использование, давайте посмотрим на решение для управления журналами приложения.
Реализуйте атрибут Pointcut (предпочтительно наследие от AspositAttribute):
interface
uses
Aspect.Core;
type
LoggingAttribute = class(AspectAttribute)
private
{ private declarations }
protected
{ protected declarations }
public
{ public declarations }
end;
implementation
end.
Реализуйте класс, который представляет ваш аспект, и содержит методы советов (вы должны реализовать интерфейс IASPept):
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.
Зарегистрируйте свой атрибут Pointcut и его аспект класса в контексте (предпочтительно сохраните этот контекст в экземпляре Singleton):
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.
В классе вашего бизнеса используйте атрибут, чтобы определить ваши точки соединения. Вы можете использовать конструктор и деструктор, чтобы добавить свой класс в ткач.
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;
Смотрите открытые проблемы для списка предлагаемых функций (и известных вопросов).
Вклад - это то, что делает сообщество с открытым исходным кодом таким удивительным местом для изучения, вдохновения и создания. Любой вклад, которые вы вносите, высоко ценится .
git checkout -b feature/AmazingFeature )git commit -m 'Add some AmazingFeature' )git push origin feature/AmazingFeature ) Распределено по лицензии Apache. Смотрите LICENSE для получения дополнительной информации.
Чтобы связаться с нами. Используйте параметры:
https://github.com/ezequieljuliano/aspect4delphi