问题标签 [spring4d]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1097 浏览

delphi - Delphi - 如何使用具有通用接口 GUID 的支持?

(代码如下)

我正在用 Delphi 和 Spring4d 库编写事件总线。

我的灵感来自 Spring4d 库(基于事件的架构)的示例

基本上,事件总线

  1. 允许添加订阅者
  2. 允许向订阅者发送事件

我对这里的subscribe方法感兴趣

我在查找给定的 aHandler 是否支持 IEventHandler 接口时遇到问题:

当它尝试订阅此事件时,我正在尝试检查是否aHandler支持该接口。IEventHandler<aEvtGUid>

我现在做的是找到IEventHandler对应的RttiInterfaceType。

然后,我考虑使用

问题是RttiInterfaceType.GUID 总是指向

此 GUID 对应于通用IEventHandler<T : IEvent>接口(见下文)。因此,只要 aHandler 实现任何IEventHandler<T : IEvent>接口,它总是会返回 true。

IEventHandler<aEvtGUid>当 aEvtGuid 是从通用接口的 RttiInterfaceType 获得的 GUID 时,如何确定处理程序是否支持?

编辑 1

我也试过

也总是返回 true。


代码

0 投票
1 回答
662 浏览

delphi - 使用 Spring4D 进行构造函数注入的“构造函数不满意”

我正在为 Spring4D 的构造函数注入而苦苦挣扎。在某个类中,我想将接口的特定实现(按名称)注入构造函数。

看这个:

现在,我使用 ServiceLocator 获得了我的新闻实例:

它工作正常。

现在我添加第二个 ListFactory:

并添加注册

并将我的 cidre press 课程更改为

问题是,没有调用 TCiderPress 的 ctor。

如果我添加

我得到一个 EActivatorException: Unsatisfied contructor on type: TCiderPress

怎么了?

编辑:

如果我像这样委托构造,它会起作用:

编辑2:

我发现了我的错误!我必须在接口使用子句中包含Spring.Container.Common 。

我正在使用 Delphi XE3 和 Spring4D 1.1.3。

0 投票
1 回答
360 浏览

delphi - 如何实现具有 IsFirst 和 IsLast 函数的 Enumerator?

我对所有集合都使用 Spring4D。

现在有一种情况,我必须知道枚举数的当前值是集合中的第一个(这很容易)还是最后一个(这很困难)。

CurrentIsFirst可以使用本地布尔值来实现,一旦第一个值通过,该布尔值就会被重置。

但是我不知道实现的简单方法CurrentIsLast

它应该能够处理惰性集合,因为它们可能包含太多无法放入内存的值。

我怎样才能实现这样的CurrentIsLast功能?

0 投票
1 回答
387 浏览

delphi - AOP 和 DI:如何创建一个切面感知的接口依赖注入对象?

我想通过 Spring/4D 框架的方式创建一个方面感知的接口依赖注入对象。我的问题是,我不知道如何将这两个部分结合起来。总体思路如下:

  1. 创建方面层对象并持有两个接口:一个作为依赖传递给对象(IAspect),一个作为方面编织到对象中(IInterceptor):

    /li>
  2. 创建接口依赖注入对象:

    /li>
  3. 编织方面:

    /li>

为了解决这个问题,我想用自定义构造函数注册一个工厂:

我的问题是,我如何在Container: TContainerSpring 中注册这个?


示例:下面的程序表现得像我想要的那样,并演示了GetValue调用通过哪些方面层运行。自定义对象的创建发生在$Region主例程中。我需要如何重构这个程序以使用 Spring/4D 框架中的 DI 容器,同时保持一个方面感知对象的自定义构造?

输出:

0 投票
0 回答
352 浏览

delphi - 如何用观察者替换多事件(Spring4D)

我有 2 个事件的类:OnConnect 和 OnDisconnect:

现在我想做同样的事情,但更多的对象风格。我的意思是使用 String4D 的接口和观察者模式。我做了这个:

我第一次这样做,只是想问一下它是否正确?或者我在这里做一些异端邪说?

0 投票
1 回答
318 浏览

delphi - Spring4D中如何使用多接口类

我只是在学习 Spring4D,我有一个问题。如果类只实现一个接口,那么一切都清楚:

我现在真的很开心,我有剑,我不需要释放它。

但是如果类实现了两个或更多接口:

我可以向 ServiceLocator 询问 TSpikedShield 的实例,但我需要选择一个 IWeapon 或 IShield。但我想以两种方式使用它(或者我不应该想要?),比如:

因此,如果我很好理解,我必须直接创建 TSpikedShiled 的实例(我的意思是没有接口)。

有什么方法可以使用这个类,但自动免费?

(如果接口可以实现多接口,但在delphi中不允许,则不会有问题)

编辑:也许有人这样想?

0 投票
2 回答
574 浏览

delphi - 如何将接口参数传递给 Spring4D?

我有以下示例。
有没有更简单的方法来传递已经为 Container 注册的接口变量来解决它?
或者,还有其他方法可以使用此功能吗?


那是我的界面

类实现

集装箱登记

调用
所以当必须创建这些接口时,我以这种方式调用,这是嵌套参数使代码复杂且难以阅读(并查看)

0 投票
5 回答
1752 浏览

delphi - 为什么迭代后会自动释放 TObjectList 类型的列表?

我对 Spring4D 框架的 TObjectList 类的行为有疑问。在我的代码中,我创建了一个几何图形列表,例如square, circle, triange,每个都定义为一个单独的类。为了在列表被破坏时自动释放几何图形,我定义了一个 TObjectList 类型的列表,如下所示:

如果我运行此代码,geometricFigures即使我没有调用Free列表上的方法,列表也会自动从内存中释放(注意 finally 块中的注释行)。我预计会有不同的行为,我认为列表需要显式调用 Free() 因为局部变量geometricFigures没有使用接口类型。

我进一步注意到,如果列表的项目没有在 for-in 循环中迭代(我暂时从代码中删除了它),则列表不会自动释放并且我会出现内存泄漏。

这使我想到以下问题:为什么 TObjectList ( geometricFigures) 类型的列表在其项目被迭代时会自动释放,但如果从代码中删除 for-in 循环则不会?

更新

我听从了 Sebastian 的建议并调试了析构函数。列表项被以下代码破坏:

更新

我不得不重新考虑我接受的答案并得出以下结论:

在我看来,Rudy 的回答是正确的,即使所描述的行为可能不是框架中的错误。我认为 Rudy 提出了一个很好的论点,他指出框架应该按预期工作。当我使用 for-in 循环时,我希望它是一个只读操作。之后清除列表不是我所期望的。

另一方面,Fritzw 和 David Heffernan 指出 Spring4D 框架的设计是基于接口的,因此应该以这种方式使用。只要记录了这种行为(也许 Fritzw 可以给我们参考文档),我同意 David 的观点,即我对框架的使用是不正确的,即使我仍然认为框架的行为具有误导性。

我在使用 Delphi 开发方面没有足够的经验来评估所描述的行为是否实际上是一个错误,或者没有因此撤销我接受的答案,对此感到抱歉。

0 投票
2 回答
639 浏览

delphi - Spring4D中的TForm管理

我有以下代码:

项目.dpr

注册接口的uRegistrations.pas

Unit3.pas 持有主窗体

Unit4.pas 与辅助形式

最后是带有接口声明的 Unit5.pas

它会定期编译和运行,但是当我关闭应用程序时,我有三个内存泄漏。

分配号:8482 程序运行时间:721 ms 类型:刷子 手柄手柄:$461027f5 样式:BS_SOLID 颜色:$f0f0f0

分配数:8318 程序运行时间:697 ms 类型:TSecondaryForm 地址:$d51ac64 大小:924 访问权限:读/写

分配号:8267 程序运行时间:693 ms 类型:字体 句柄:$1d0a28f1 面:Tahoma 高度:-11

为什么会发生这种情况,我该如何解决?

编辑

得到答案后,我实现了以下解决方案(评论突出显示了我得到的错误:

我还尝试通过以下方式修改 TSecondaryForm 的 OnClose 方法:

但我有内存泄漏。

我对上述所有技术做错了什么?

最后,我只是按照评论中的建议让_AddRef_Release两种方法管理引用计数,并且我没有更多的内存泄漏。

0 投票
2 回答
294 浏览

delphi - 如何将 IEnumerable 的 IEnumerable 折叠为单个 IEnumerable?

那不会编译,因为TConcatIterator<T>只能连接两个枚举,但我需要的是一个迭代器,它连接一个枚举的枚举。

Haskell 具有concat执行此操作的功能:

Delphi 版本如下所示:

我怎样才能在spring4d中实现这个?