DelphiEventBus
1.0.0
Implementation of event bus pattern for Delphi XE
EventBus is designed to provide interaction between different components, without increasing connectivity.
//event class declaration
Type
TFooEventObject = class(TbtkEventObject)
//..........................
public
const sFooFilterName = 'FooFilter';
constructor Create(ATopic: string; AFooFliter: string);
[EventFilter(sFooFilterName)] //filter parameter declaration
function FooFilter: string;
//..........................
end;
//preparation of the listener
TFooEventListener = class
//..........................
public
[EventHandler] //handler declaration
procedure FooHandler(AFooEvent: TFooEventObject);
[EventHook] //hook declaration
procedure FooHook(AEventObject: TFooEventObject);
//..........................
end;
EventBus := TbtkEventBus.GetEventBus('FooEventBus');
ListenerInfo := EventBus.Register(FooEventListener);
//setting filter parameters
ListenerInfo.HandlerFilters[TFooEventObject][TFooEventObject.sEventFilterTopicName].Value := 'TopicValue';
ListenerInfo.HandlerFilters[TFooEventObject][TFooEventObject.sFooFilterName].Value := 'FooFilterValue';
//creating and sending events
EventBus.Send(TFooEventObject.Create('TopicValue', 'FooFilterValue'));
//listener unregistration
EventBus.Unregister(FooListener); program EventHookExample;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
btkEventBus;
type
TFooEventListener = class
public
[EventHook] //hook declaration
procedure FooHook(EventObject: TbtkEventObject);
end;
{ TFooEventListener }
//hook implementation
procedure TFooEventListener.FooHook(EventObject: TbtkEventObject);
begin
Writeln(Format('======'#13#10'Event with topic "%s" sended', [EventObject.Topic]));
end;
const
ebFoo = 'FooEventBus';
var
FooEventListener: TFooEventListener;
FooTopicName: string;
begin
//register class for eventbus with name 'FooEventBus'
RegisterEventBusClass(TbtkEventBus, ebFoo);
FooEventListener := TFooEventListener.Create;
try
//register listener
EventBus(ebFoo).Register(FooEventListener);
Write('Write topic: ');
ReadLn(FooTopicName);
//create and send event
EventBus(ebFoo).Send(TbtkEventObject.Create(FooTopicName));
finally
FooEventListener.Free;
end;
Readln;
end. program EventHookExample;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
btkEventBus;
type
TFooEventListener = class
public
[EventHandler] //handler declaration
procedure FooHandler(EventObject: TbtkEventObject);
end;
{ TFooEventListener }
//handler implementation
procedure TFooEventListener.FooHandler(EventObject: TbtkEventObject);
begin
Writeln(Format('Event with topic "%s" sended', [EventObject.Topic]));
end;
const
FooTopicName = 'FooTopic';
var
FooEventListener: TFooEventListener;
FooListenerInfo: TbtkListenerInfo;
begin
//register class for eventbus with empty name
RegisterEventBusClass(TbtkEventBus);
FooEventListener := TFooEventListener.Create;
try
//register listener and get listner info
FooListenerInfo := EventBus.Register(FooEventListener);
//set topicfilter for handler
FooListenerInfo.HandlerFilters.Items[TbtkEventObject].Filters[TbtkEventObject.sEventFilterTopicName].Value := FooTopicName;
//create and send event
EventBus.Send(TbtkEventObject.Create(FooTopicName));
finally
FooEventListener.Free;
end;
Readln;
end.