问题标签 [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.
java - 如何使用 Spring Framework 确保给定的依赖项包含在我的应用程序中?
这将是一个难以描述的问题,但这里有。
我们正在使用 Delphi Spring 框架。(http://code.google.com/p/delphi-spring-framework/)
假设我有一个 UnitA,它声明了由 ClassA 实现的 InterfaceA。
同样,我有 UnitB 声明由 ClassB 实现的 InterfaceB。
两者都在各自的初始化部分中向 Spring Container 注册了它们的接口和它们的类。
InterfaceA 依赖于 InterfaceB,但是因为我们使用的是 Spring,所以 UnitA 的子句中没有 UnitB uses
。换句话说,我们已经完成了我们的工作——我们已经解耦了 UnitA 和 UnitB,但我们仍然能够让 InterfaceA 依赖于 InterfaceB。
但是,鉴于上述情况,我们需要确保 UnitA 和 UnitB 都包含在项目中,以便解决依赖关系。
现在想象一下,我们开始一个新项目。那个新项目使用了 UnitA,但开发者没有意识到如果要使用 UnitA,还必须在项目中包含 UnitB。不会出现编译错误,因为依赖是在运行时解决的,而不是编译时。
这里有一个问题:确保在部署应用程序之前知道对 UnitB 的这种依赖关系的正确方法是什么?
我们可以预见一个复杂应用程序中的情况,尽管经过彻底的测试,给定的代码路径可能很长时间都没有执行,并且在部署之前没有发现这种缺失的依赖关系。
我们已经实现了一个系统,其中每个接口解析调用都伴随着一个Requires
调用,该调用在启动时检查并引发异常,确保我们会看到错误。但我们想知道是否有“最佳实践”或标准方法来检测或以其他方式处理此问题。
补充: 这是 Java 和其他语言的问题吗?
delphi - 如何使用 spring4d 中的 IMultiCastEvent?
我正在尝试开始使用 spring4d 的集合部分。但我无法订阅集合更改事件。得到错误:[DCC 错误]:E2008 不兼容的类型在:
TObjectList 的 OnNotify 属性声明为:
property OnNotify: ICollectionNotifyDelegate<T>
, 在哪里
即 OnNotify.Add 方法需要一个 Generics.Collections.TCollectionNotifyEvent,它声明为:
我的事件处理程序声明为:
我很困惑%)请帮助)
delphi - delphi - 如何将参数从实例化器传递给spring4d依赖注入框架中的构造函数?
是否可以注册一个带有预期从创建点传递的参数的类?
我知道可以这样做:
但是那里的参数被绑定到容器被注册的执行上下文,而不是对象被实例化的地方。
例如,这样的事情可能吗?
我知道有些人提倡使用非常简单的构造函数,但有时构造函数参数看起来很明显是要走的路:
构造的对象需要对象参数才能工作,所以必须满足引用。该参数还使该约束在查看类时更加明显。
如果您尝试使用对象而不首先进行分配,您可以在方法或属性中分配引用并在所有其他方法中引发和异常。我不喜欢编写这种类型的代码,这只是浪费时间,只是使用构造函数参数并在那里检查。代码越少,IMO 就越好。
此外,被传递的对象对于使用容器构造新对象的对象(例如 Transaction 对象)是本地的,并且具有某种状态(它不是我可以通过容器获得的新对象)。
delphi - 如何在接口中实现参数化方法以在 Spring Framework 中使用
我正在尝试集成 Aurelius ORM 框架和 Spring 4D 框架,并且我大部分都成功了,但是 Aurelius ORM(以及其他)依赖于“对象管理器”来加载和保存数据库中的对象。我正在做的部分工作是尽可能多地分离类的实现和接口。但是,在为此对象管理器(Aurelius 中的 TObjectManager)创建接口时,我很难实现对象管理器的“查找”方法。例如,对象管理器支持以下方法:
现在尝试将 ObjectManager 声明转换为接口我尝试按以下方式进行操作:
这就是问题所在,因为编译器失败并出现错误:
基本上我需要想出一个可以在我自己的对象管理器中调用的接口函数,例如:
感谢任何人的帮助,几天来一直试图提出一个灵魂。
delphi - 测试未在接口部分声明的类
我是一个依赖注入容器的新手,我正在尝试将它们与 Mocking 结合使用。
假设我有一个控制器和一个列表(模型):
IController 的实现看起来像(注意,它在以下implementaion
部分:
然后,当然,我会注册这个类(以及 IBlahList 的一个)GlobalContainer
:
implementation
根据各种来源的建议(好吧,无论如何,尼克霍奇斯!),我将 TController 放在该部分中,这样我们就不能直接引用 TController 类。
现在,只是说我想在单元测试中测试我的 ICollection 实现:
所以,我的问题是,我应该将 TController 类移到我的interface
部分中以便我可以测试它,还是有其他方法可以将模拟 IBlahList 传递给我尚未找到的控制器?
delphi - Delphi Spring DI:是否可以在没有实现类型的情况下委托接口实例化?
我刚开始使用 Delphi Spring Framework,想知道当前版本的 DI 容器是否允许在不指定实现类型的情况下将构造委托给工厂方法?
例如类似这样的东西:
如您所见,我的具体用例是 COM 对象的实例化。在这种情况下,实现我感兴趣的接口的类不是我的应用程序的一部分,但我仍然可以通过调用CreateComObject
/创建实例CoCreateInstance
。但是,似乎我不走运,因为 Container 中的注册似乎总是绑定到实际的实现类。
假设目前这是不可能的,那么你们那里的专家将如何解决这个问题?您会创建一个包装类或虚拟类,还是只是将 COM 对象排除在 DI 容器之外并简单地通过实例化它们CreateComObject
?
delphi - Delphi 的 Spring 中 GlobalContainer 和 ServiceLocator 有什么区别?
他们看起来如此相似。我可以在 GlobalContainer 中注册一些东西:
GlobalContainer
并通过or获取一个实例ServiceLocator
,它们都可以工作:
delphi - 如何在 Spring for Delphi 中使用具有自动装配功能的模拟?
如果我有这些接口:
他们的实现(控制器需要通过构造器注入的 Sequencer):
我在全局容器中注册实现:
最后,通过自动连接功能,我可以获得一个新的IController
接口实例:
这对于真正的应用程序代码来说是可以的。但在测试项目中我想模拟ISequencer
. 根据测试,当我向容器请求实现时ISequencer
,有时我需要真正的实现(TSequencer
),而其他时候我需要一个模拟实现(如TSequencerMock
)。我该怎么做这个开关?
delphi - 如何在不注册类类型的情况下使用 Spring 的 DI 容器模拟接口?
我正在尝试解耦现有代码以便能够对其进行单元测试。我已经引入了接口来去除对UI对象的依赖。问题是Spring容器的RegisterComponent<T>调用需要一个TComponentType参数,所以我不能调用RegisterComponent<IMyProgressBar>我必须调用RegisterType<TMyProgressBar>.Implements<IMyProgressBar>这意味着我必须在 DUnit 中使用包含进度条类定义的单元,这违背了将 DIContainer 与 ServiceLocater 一起使用的目的,以便在我需要时请求进度条。
我不想创建模拟类并手动实现接口。有没有办法使用 Delphi.Mocks 自动模拟接口而不指定实现类?
delphi - 如何使用 TObservableDelphi Spring框架中的.RemoveListener()?
在 Delphi Spring 框架中,\Spring4D\Samples\SpringDemos\Demo.Patterns\Observer 文件夹中有一个关于如何使用 TObservable.AddListener() 的示例。
但是没有一个例子说明如何使用 TObservable.RemoveListener()。
这里我添加了一个监听器
FEditorMonitor := TEditorMonitor.Create;
FEditorMonitor.AddListener(TCurrentTimeEditUpdater.Create(Edit1));
如果我尝试使用以下代码从侦听器中删除 Edit1,则会继续通知 Edit1:
FEditorMonitor.RemoveListener(TCurrentTimeEditUpdater.Create(Edit1));
任何想法?