2012-05-25 21 views
5

Me gustaría ser capaz de código en Delphi esta manera, sólo tiene que anotar un campo:¿Existe un marco de inyección de dependencias para Delphi con inyección basada en atributos?

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

o mediante la asignación de un regulador

type 
    TMyClass = class 
    private 
    FFactory: ISomeFactory; 

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

El fondo: Me estoy moviendo código antiguo a una arquitectura orientada a servicios y encontrar que hacer referencia a la capa de servicio siempre conduce a construcciones como

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

que podría ser mucho más corto como

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

Evitar el uso de la inyección a base de atributos. Use la inyección de constructor siempre que sea posible. – Steven

+0

@Steven Eso probablemente depende de la dependencia. Si la clase absolutamente no funcionará sin ella, entonces sí, el constructor es más apropiado. Si puede funcionar razonablemente sin él, la inyección de propiedades es una forma de hacerlo opcional. – R0MANARMY

+1

@ R0MANARMY: Pero aún así no debería tener que usar un atributo para usar la inyección de propiedades. Esto obliga a la aplicación a tomar una dependencia del contenedor, pero la aplicación debe ser inconsciente. – Steven

Respuesta

9

Sí, la hay. El Marco de Delphi primavera

http://www.spring4d.com/

hace precisamente esto. Tiene un atributo [Inyectar].

Una advertencia: para usarla, debe incluir la unidad Spring en el código donde se define el atributo. De lo contrario, el compilador ignorará el atributo.

Cuestiones relacionadas