delphi डेल्फी आईओसी बनाना अप्रयुक्त वर्गों को हटाने से डेल्फी के लिंकर को अक्षम कैसे करें




linker inversion-of-control (2)

मैंने डेल्फी में एक आईओसी को स्वचालित रूप से किसी भी वर्ग को पंजीकृत करने की क्षमता के साथ बनाया है जिस पर IocSingletonAttribute है I

ऑटोरेजिस्टर निम्नलिखित की तरह दिखता है

procedure TIocContainer.AutoRegister;
var
  ctx: TRttiContext;
  rType: TRttiType;
  attr: TCustomAttribute;
  &Type: PTypeInfo;
begin
  ctx := TRttiContext.Create;
  for rType in ctx.GetTypes do
  Begin
    for attr in rType.GetAttributes do
    Begin
      if TypeInfo(IocSingletonAttribute) = attr.ClassInfo then
      Begin
        &Type := IocSingletonAttribute(attr).&Type;
        RegisterType(&Type, rType.Handle, True);
      End;
    End;
  End;
end;

तब मैं एक कार्यान्वयन बना रहा हूं और IocSingletonAttribute को इसमें जोड़ें यह इस तरह दिख रहा है

[IocSingleton(TypeInfo(IIocSingleton))]
TIocSingleton = class(TInterfacedObject, IIocSingleton)
  procedure DoSomeWork;
end;

तो, अब कार्यक्रम के वास्तविक कोड के लिए। अगर मैं आईओसी के नीचे कोड लिखूंगा काम नहीं करता है ऑटो पंजीकरण प्रक्रिया ने टीआईओसीसिसिंगटन नहीं उठाया

var
  Ioc: TIocContainer;  
  Singleton: IIocSingleton;  
begin  
  Ioc := TIocContainer.Create;
  try    
    Ioc.AutoRegister;
    Singleton := Ioc.Resolve<IIocSingleton>();
    Singleton.DoSomeWork;
  finally 
    Ioc.Free;
  end;
end.

लेकिन अगर मैं नीचे दिए गए कोड को लिखता हूं तो उम्मीद के मुताबिक सब कुछ काम करता है सूचना दें कि मैंने किस प्रकार टीआईओकसिलिंग्टन वर्ग को घोषित किया है और इसका इस्तेमाल किया है

var
  Ioc: TIocContainer;  
  Singleton: IIocSingleton;  
  ASingleton: TIocSingleton;
begin  
  Ioc := TIocContainer.Create;
  ASingleton := TIocSingleton.Create;
  try    
    Ioc.AutoRegister;
    Singleton := Ioc.Resolve<IIocSingleton>();
    Singleton.DoSomeWork;
  finally 
    Singleton.Free;
    Ioc.Free;
  end;
end.

इसलिए इस पर आधारित, मैं मान रहा हूं कि डेल्फी के कंपाइलर लिंकर पहले उदाहरण में टीआईओकसिलिंग्टन को निकाल रहा है क्योंकि यह कभी भी आवेदन के किसी भी हिस्से में स्पष्ट रूप से उपयोग नहीं किया गया था। तो मेरा सवाल है, क्या किसी खास वर्ग के लिए कंपाइलर के 'अप्रयुक्त कोड को हटा दें' सुविधा को चालू करना संभव है? या अगर मेरी समस्या लिंकर नहीं है, तो कोई दूसरा प्रकाश क्यों छोड़ सकता है कि दूसरा उदाहरण क्यों काम करता है लेकिन पहले नहीं?


{$STRONGLINKTYPES ON} को निर्देश {$STRONGLINKTYPES ON} जोड़ें फिर उन प्रकारों को शामिल किया जाना चाहिए। लेकिन यह निश्चित रूप से आपके आवेदन को उड़ा देगा, क्योंकि यह एक एकल वर्ग के लिए उपलब्ध नहीं है।


सेबस्टियन जेड के लिए और Agustin Ortu टिप्पणी के लिए धन्यवाद धन्यवाद उनकी दोनों प्रतिक्रियाओं ने मुझे अंतिम समाधान के लिए मिला। दुर्भाग्य से, सिर्फ एक वर्ग के लिए STRONGLINKTYPES का उपयोग करना संभव नहीं है, और क्लास को किसी तरह संदर्भित करने की आवश्यकता है। मैंने ऑगस्टिन ओर्टू के सटीक सुझाव का उपयोग नहीं करने का निर्णय लिया, लेकिन मैंने इस अवधारणा का इस्तेमाल किया।

उस इकाई में जहां IoC परिभाषित किया गया है मैं निम्नलिखित खाली प्रक्रिया का उत्पादन करता हूँ

procedure IocReference(AClass: TClass);

implementation

procedure IocReference(AClass: TClass);
begin
end; 

और क्लास में जो आईओसी द्वारा उपयोग की जाने वाली एक क्लास बनाता है I निम्नलिखित को जोड़ता है I

initialization
  IocReference(TIocSingleton);
end.

क्लाइंट फ़ंक्शन कॉल करने के बजाय लिंकर को कोड हटाने से रोकने के लिए एक प्रक्रिया का उपयोग करने का कारण, जैसे कि (टीआईओसीसिंलिंगटन। क्लासनाम) यह बेहतर जानकारी प्रदान करता है अगर कोई अन्य प्रोग्रामर कोड पढ़ता है, तो यह अच्छी अनुमान लगा सकता है कि वह रेखा क्यों है





inversion-of-control