首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建一个Delphi IoC。如何禁止Delphi的链接器删除未使用的类

创建一个Delphi IoC。如何禁止Delphi的链接器删除未使用的类
EN

Stack Overflow用户
提问于 2017-02-06 00:29:08
回答 2查看 352关注 0票数 6

我已经在Delphi语言中创建了一个IoC,它能够自动注册任何带有IocSingletonAttribute的类。

AutoRegister如下所示。

代码语言:javascript
运行
复制
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添加到其中。它看起来像这样

代码语言:javascript
运行
复制
[IocSingleton(TypeInfo(IIocSingleton))]
TIocSingleton = class(TInterfacedObject, IIocSingleton)
  procedure DoSomeWork;
end;

那么,现在来看程序的实际代码。如果我写下面的代码,IoC就不能工作。AutoRegister过程没有检测到TIocSingleton。

代码语言:javascript
运行
复制
var
  Ioc: TIocContainer;  
  Singleton: IIocSingleton;  
begin  
  Ioc := TIocContainer.Create;
  try    
    Ioc.AutoRegister;
    Singleton := Ioc.Resolve<IIocSingleton>();
    Singleton.DoSomeWork;
  finally 
    Ioc.Free;
  end;
end.

但是,如果我编写下面的代码,一切都会按预期运行。注意我是如何声明TIocSingleton类并使用它的。

代码语言:javascript
运行
复制
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.

因此,基于此,我假设Delphi的编译器链接器在第一个示例中删除了TIocSingleton,因为它从未在应用程序的任何部分显式使用过。所以我的问题是,有没有可能为某个类打开编译器的“删除未使用的代码”功能?或者,如果我的问题不是链接器,那么有谁可以解释为什么第二个示例可以工作,而第一个不能呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-09 06:41:56

感谢Sebastian Z回答和奥古斯丁·奥尔图的评论。他们的两个回答都给了我一个最终的解决方案。不幸的是,STRONGLINKTYPES不可能只用于一个类,而且这个类需要以某种方式被引用。我决定不使用Augstin Ortu确切的建议,但我确实使用了这个概念。

在定义IoC的单元中,我输出以下空过程。

代码语言:javascript
运行
复制
procedure IocReference(AClass: TClass);

implementation

procedure IocReference(AClass: TClass);
begin
end; 

在创建要由IoC使用的类的类中,我添加了以下内容

代码语言:javascript
运行
复制
initialization
  IocReference(TIocSingleton);
end.

使用过程来防止链接器删除代码而不是仅仅调用类函数的原因,例如(TIocSingleton.ClassName)是因为它提供了更好的信息。如果另一个程序员阅读了代码,他们可以很好地猜测为什么会有这一行。

票数 1
EN

Stack Overflow用户

发布于 2017-02-06 05:38:16

{$STRONGLINKTYPES ON}指令添加到.dpr。那么这些类型就应该包括在内。但它肯定会毁掉你的应用程序,因为它不适用于单个类。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42054460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档