- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚开始使用 Delphi Spring 框架,想知道当前版本的 DI 容器是否以某种方式允许将构造委托(delegate)给工厂方法而不指定实现类型?
例如与此类似的东西:
GlobalContainer
.RegisterFactory<ISomeObject>(
function: ISomeObject
begin
Result := CreateComObject(CLASS_SomeObject) as ISomeObject;
end)
.Implements<ISomeObject> // could probably be implied from the above
.AsSingletonPerThread;
如您所见,我的具体用例是 COM 对象的实例化。在这种情况下,实现我感兴趣的接口(interface)的类不是我的应用程序的一部分,但我仍然可以通过调用 CreateComObject
/CoCreateInstance
创建实例。然而,我似乎运气不好,因为容器中的注册似乎总是绑定(bind)到实际的实现类。
假设目前这是不可能的,你们的专家将如何解决这个问题?您会创建一个包装类或虚拟类,还是只是将 COM 对象保留在 DI 容器之外并通过 CreateComObject
实例化它们?
最佳答案
不幸的是,Spring DI 容器的当前设计不允许这样做。它内部假设每个服务类型(通常是接口(interface),但也可以是类)都是由组件类型(类)实现的。因此有TObject
在我们需要的几个地方 IInterface
在这种情况下。就像您传递给 DelegateTo 方法的委托(delegate)一样,返回组件类型(或非通用情况下的 TObject)而不是服务类型。
这也是因为您可以在一次流畅的接口(interface)调用中注册一种具有多个接口(interface)实现的组件类型。喜欢:
GlobalContainer
.RegisterType<TMyObject>
.Implements<IMyInterface>
.Implements<IMyOtherInterface>;
容器现在检查是否 TMyObject
与 IMyInterface
兼容和IMyOtherInterface
。调用Resolve
时服务解析器使用 GetInterface
在实例上获取请求的接口(interface)引用。超出该点的所有操作都是在对象引用上完成的。
由于我对 DI 容器有一些计划,要求在注册接口(interface)时不依赖于实现类,因此这个问题将在将来得到解决,但不会很快得到解决。
更新(2012 年 11 月 8 日):
自 r522 起,可以通过以下方式注册接口(interface)类型:
GlobalContainer
.RegisterType<ISomeObject>
.DelegateTo(
function: ISomeObject
begin
Result := CreateComObject(CLASS_SomeObject) as ISomeObject;
end)
.AsSingletonPerThread;
在此示例中,它将注册 ISomeObject
作为服务以及具有其继承的 GUID 的任何接口(interface)。
此外,您还可以通过调用 Implements<T>
添加其他接口(interface)但与类不同的是,如果构造的实例实际上确实支持该接口(interface),则在注册时不会进行验证,因为这是不可能的。目前您将获得nil
调用Resolve<T>
时具有不受支持的服务类型。将来可能会引发异常。
关于德尔福 Spring DI : Is it possible to delegate interface instantiation without an implementing type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11312357/
我有一个包含需要排序的不同项目的列表。但还有一个额外的问题:某些元素只允许出现在列表中的特定位置。 示例(请查看 http://jsfiddle.net/pYL32/2/ ):有一个包含元素 foo、
关于https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained据解释,guava(以及后来的 java 8
我有一个名为 say CalculationOutcome 的类(class)和 FileHashOutcome .他们的构造函数有 (ActualResult, Throwable)参数,并在 Co
我正在使用pycharm,我的代码在分屏上。当我运行调试时,会弹出调试/运行窗口,它非常分散注意力并且限制了我在调试时可以查看的代码量......但我想保持它,因为我来回走动;另外,我想要调试变量的完
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: javascript object, access variable property name? 我确信这是可以完
if (typeof Object.create !== 'function') { Object.create = function (o) { function F() {
在将实体存储在 redis 中作为序列化二进制 blob 的应用程序中工作。我有多个客户端处理同一个数据集,我希望使用乐观并发。 我的要求是: 在一次往返中读取特定键的序列化实体 将修改后的实体写回r
这个问题是指 C/x86 上使用的 IEEE 标准浮点数。 是否可以将任何数字(即不包括 NaN 之类的特殊值)浮点数或 double 数表示为十进制字符串,以便将该字符串转换回浮点数/ double
我的团队目前正在与 Lua 合作,创建一个 android 游戏。我们遇到的一件事是表面上无法创建重载构造函数。 我习惯于使用默认值设置一个对象,然后在需要时使其过载。 前任: apples() {
如何在 Scene Kit 中使用 SCNCamera 获得像鱼眼镜头那样的失真? 类似于这种图像的“鞠躬”: //正如 Rickster 指出的那样,这种失真被称为“桶形失真”。 从文档中,这是让我
我想问是否有一种方法可以多次评估 javascript 术语,而不需要一遍又一遍地解析一个术语。 说,您想要评估 var1/var2+Math.sqrt(var3) 每秒 20 次。 使用时这可能会出
我想知道在技术上是否可以在 java applet 中创建代理。 那么是否可以通过这个 java applet 代理路由所有进一步的浏览器请求? 例如,如果用户要浏览 google.com,默认行为是
我有以下代码,我想返回一个 bool 值或一个元组。 (函数 isvariable 和 dont_care 都返回 bool 值,仅供引用) let match_element (a, b) = if
这个问题困扰我很久了。我想要一个二叉树(或类似的嵌套结构)上的迭代器,它高效、简单且Pythonic。例如,对于这样的用法: for value in values(root): do_som
目前我有以下 MySQL 查询: SELECT COUNT(*) AS `count`, `v`.`value` FROM `client_entity_int` AS `v` INN
我正在使用 Angular 开发应用程序,客户端是 100% JS。我即将替换使用 ExtJS 制作的旧应用程序,但我不会更改服务器端。只有客户端从头开始重新编码。 我想在任何地方和任何机器上处理这个
有没有办法在运行时检索实例的声明类?例如: public class Caller { private JFrame frame = new JFrame("Test"); priva
我目前正在请求 MySQL 数据库使用 PDO 计算一些计数和总和。这个过程可能需要一段时间,如果用户突然想浏览另一个页面,他可能会停留在浏览器前面。 我试图弄清楚是否可以使用 PDO 启动 MySQ
想知道它是不是这样工作的: $result .= mysqli_query($query1); $result .= mysqli_query($query2); $result 会是查询 1 和 2
所以我有这样的挑战: body 背景上的图像,背景大小,覆盖以适合整个屏幕。在背景图像上是一些元素(建筑物)。所以我想将鼠标悬停在建筑物上,他们会更改颜色或添加阴影等。问题在于屏幕调整大小,当我调整屏
我是一名优秀的程序员,十分优秀!