2012-05-25 13 views
5

मैं डेल्फी में इस तरह से कोड करने के लिए, बस एक क्षेत्र व्याख्या सक्षम होने के लिए प्यार होता है:विशेषता-आधारित इंजेक्शन के साथ डेल्फी के लिए निर्भरता इंजेक्शन फ्रेमवर्क है?

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

या एक सेटर

type 
    TMyClass = class 
    private 
    FFactory: ISomeFactory; 

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

पृष्ठभूमि का श्रेय प्रदान द्वारा: मैं पुराने कोड का स्थान बदलना कर रहा हूँ एक सेवा-उन्मुख वास्तुकला के लिए और पता लगाएं कि सेवा परत का संदर्भ हमेशा

DataModule1.ServiceLayerInstance1.SubSystemN.InvokeSomething(Params, ...); 
जैसे संरचनाओं की ओर जाता है

जो

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

रोकें विशेषता आधारित इंजेक्शन का उपयोग कर:

Google Code पर परियोजना देखें। जहां संभव हो वहां कन्स्ट्रक्टर इंजेक्शन का प्रयोग करें। – Steven

+0

@ स्टेवेन शायद निर्भरता पर निर्भर करता है। यदि कक्षा पूरी तरह से इसके बिना काम नहीं करेगी, तो हाँ, कन्स्ट्रक्टर अधिक उपयुक्त है। यदि यह उचित रूप से इसके बिना काम कर सकता है, तो संपत्ति इंजेक्शन इसे वैकल्पिक बनाने का एक तरीका है। – R0MANARMY

+1

@ R0MANARMY: लेकिन फिर भी आपको संपत्ति इंजेक्शन का उपयोग करने के लिए एक विशेषता का उपयोग नहीं करना चाहिए। यह एप्लिकेशन को कंटेनर पर निर्भरता लेने के लिए मजबूर करता है, लेकिन आवेदन अनजान होना चाहिए। – Steven

उत्तर

9

हाँ की तरह बहुत कम हो सकता है, वहाँ है। डेल्फी स्प्रिंग फ्रेमवर्क

http://www.spring4d.com/

ठीक करता है। इसमें एक [इंजेक्ट] विशेषता है।

एक चेतावनी - इसका उपयोग करने के लिए, आपको अपने कोड में स्प्रिंग इकाई को शामिल करने की आवश्यकता है जहां विशेषता परिभाषित की गई है। अन्यथा, संकलक विशेषता को अनदेखा कर देगा।

संबंधित मुद्दे