[IoC and DI] Specific instances for object groups

81 views
Skip to first unread message

Jacek Laskowski

unread,
Jun 19, 2017, 4:50:14 AM6/19/17
to Spring4D
Everything works on interfaces, but I skip interfaces for simplicity.

I have a base class:

 TBaseClass = class
  fLogger
: TLogger;
 
end;
 
Two usable classes are inherited from it:
 
 TClassA = class(TBaseClass)
  fWorkClass1
: TWorkClassA;  
  fWorkClass2
: TWorkClassB;
 
end;
 
 
TClassB = class(TBaseClass)
  fWorkClass3
: TWorkClassC;
  fWorkClass4
: TWorkClassD;
 
end;

...which have working classes:
 
 TWorkClassA = class
  fLogger
: TLogger;
 
end;
 
 
TWorkClassB = class
  fLogger
: Tlogger;
 
end;
 
 
TWorkClassC = class
  fLogger
: TLogger;
 
end;
 
 
TWorkClassD = class
  fLogger
: Tlogger;
 
end;

These objects I use directly in the code:

var
 
ObjectA : TClassA;
 
ObjectB : TClassB;


ObjectA and ObjectB create their own separate workgroups, and I would like all classes in the group to use the same fLogger instance.
 
I would like to create two instances of TLogger:
- first for objects: ObjectA, fWorkClass1, fWorkClass2
- second for object: ObjectB, fWorkClass3, fWorkClass4

How to register and get from Spring4D?

Eddy M.

unread,
Jun 26, 2017, 3:22:45 AM6/26/17
to Spring4D
Hi Jacek,
I think you can use Aspects oriented programming. Try DSharp library. (I haven't tried yet, but it looks impressive)

Honza Rameš

unread,
Jul 3, 2017, 8:28:22 AM7/3/17
to Spring4D
Hi Jacek,
I'd recommend using named injections. (Stefan has some surprises that might allow you to achieve similar functionality differently, stay tuned for 1.3 ;-) ).

Honza

Stefan Glienke

unread,
Jul 4, 2017, 3:30:11 AM7/4/17
to Spring4D
You can write your own resolver that handles TLogger and injects the same instance based on some criteria (like a Logger('groupname') attribute on your injection target or something like that)
Reply all
Reply to author
Forward
0 new messages