2012-05-25 11 views
5

Mi piacerebbe essere in grado di codificare in Delphi questo modo, è sufficiente annotare un campo:Esiste un Dipendenza per Delphi con un'iniezione basata su attributi?

type 
    TMyClass = class 
    private 
    [Inject] 
    Factory: ISomeFactory; 
    ... 
    end; 

o attribuendo un setter

type 
    TMyClass = class 
    private 
    FFactory: ISomeFactory; 

    [Inject] 
    procedure SetFactory(const AFactory: ISomeFactory); 
    ... 
    public 
    property Factory: ISomeFactory read FFactory write SetFactory; 
    end; 

Lo sfondo: mi sto muovendo vecchio codice a un'architettura orientata ai servizi e scopri che fare riferimento al livello di servizio porta sempre a costrutti come

DataModule1.ServiceLayerInstance1.SubSystemN.InvokeSomething(Params, ...); 

che potrebbe essere molto più breve come

type 
    Form1 = class(TForm1) 
    private 
    [Inject] 
    SubsystemN: ISubsystemN; 
    ... 
    end; 
    ... 
    SubsystemN.InvokeSomething(Params, ...); 
+2

Prevenire con iniezione a base attributo. Utilizzare l'iniezione del costruttore ove possibile. – Steven

+0

@Steven Questo probabilmente dipende dalla dipendenza. Se la classe assolutamente non funzionerà senza di essa, allora sì, il costruttore è più appropriato. Se può ragionevolmente funzionare senza di esso, l'iniezione di proprietà è un modo per renderlo opzionale. – R0MANARMY

+1

@ R0MANARMY: Tuttavia, non è necessario utilizzare un attributo per l'utilizzo di un'iniezione di proprietà. Ciò impone all'applicazione di assumere una dipendenza dal contenitore, ma l'applicazione dovrebbe essere ignara. – Steven

risposta

9

sì, c'è. Il Delphi Spring Framework

http://www.spring4d.com/

fa esattamente questo. Ha un attributo [Inject].

Un avvertimento: per utilizzarlo, è necessario includere l'unità Spring nel codice in cui è definito l'attributo. Altrimenti, il compilatore ignorerà l'attributo.

Problemi correlati