Utworzono IoC w delphi z możliwością automatycznego rejestrowania dowolnych klas, które mają do niego IocSingletonAttribute.Tworzenie IoC Delphi. Jak wyłączyć linker Delphi z usuwania nieużywanych klas?
AutoRegister wygląda następująco.
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;
Następnie tworzę implementację i dodaję do niej IocSingletonAttribute. Wygląda teraz tak, jak na aktualny kod programu. Jeśli piszę poniższy kod, IoC nie działa. Procedura AutoRegister nie pobrała TIocSingleton.
var
Ioc: TIocContainer;
Singleton: IIocSingleton;
begin
Ioc := TIocContainer.Create;
try
Ioc.AutoRegister;
Singleton := Ioc.Resolve<IIocSingleton>();
Singleton.DoSomeWork;
finally
Ioc.Free;
end;
end.
Ale jeśli napiszę poniższy kod, wszystko działa zgodnie z oczekiwaniami. Zwróć uwagę, jak zadeklarowałem klasę TIocSingleton i użyłem jej.
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.
więc na podstawie tego, jestem przy założeniu Delphi kompilator łącznik usuwania TIocSingleton w pierwszym przykładzie, ponieważ nigdy nie został wyraźnie stosowane w dowolnej części aplikacji. Moje pytanie brzmi: czy możliwe jest wyłączenie funkcji "usuń nieużywany kod" kompilatora dla danej klasy? Lub jeśli moim problemem nie jest linker, czy ktoś może rzucić światło na to, dlaczego drugi przykład działa, ale nie pierwszy?
Myślę, że jedyną nadzieją jest dołączenie kodu, który zmusza łącznika do włączenia klasy. Dodanie inicjalizacji TIoCSingleton.ClassName zrobi. Tak, musisz to zrobić dla każdej klasy, w której się rejestrujesz. Inną możliwością może być użycie pakietów –
Dzięki za napiwek. Wywołanie TIoCSingleton.ClassName w części inicjalizacyjnej jednostki może nie być zbyt trudne, aby żyć z – Coolio