- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
与 Spring4d ,你可以像这样注册自定义工厂
aContainer.RegisterInstance<TFunc<string, TMyObject>>(function(aName : string):TMyObject
begin
Result := TMyObject.Create(aName);
end);
通过这种方式,我相信对于从 TComponent
继承的每个依赖项,想要超越所有者的人要么这样做
// Registrations
aContainer.RegisterInstance<TFunc<TComponent, TMyObject>>(function(Owner : TComponent):TMyObject
begin
Result := TMyObject.Create(Owner);
end);
// Then in code
constructor TMyClass.Create(aFctry : TFunc<TComponent, TMyObject>);
begin
fObj := aFctry(Self);
end;
或者也可以这样做
aContainer.RegisterType<TMyObject, TMyObject>;
// In code
constructor TMyClass.Create(aObj : TMyObject);
begin
fObj := aObj;
InsertComponent(aObj);
end;
不过,这很容易出错/添加代码只是为了传递所有者。是否有一种内置方法可以获取以 TComponent 作为参数的工厂,而无需事先在容器中注册它?
因为我经常会用到
constructor MyObject.Create(aDep : TFunc<TMyDep>);
未注册 TFunc<TMyDep>
依赖项,但仅限 TMyDep
类型。
是否可以传递类似的内容
constructor MyObject.Create(aDep : TFunc<TComponent, TMyDep>);
无需在容器中注册它?
最佳答案
据我所知,如果没有注册,这是不可能的。
但是,有一种方法可以使用不同的 IFactory<T,TResult>
来摆脱 1-4 个参数的手动工厂实现。接口(interface)来自 Spring.Container.Common
,注册后将由 DI 容器自动实现。
所以你可以这样注册:
aContainer.RegisterType<TMyObject>;
aContainer.RegisterType<IFactory<TComponent, TMyObject>>.AsFactory;
像这样注册工厂,不需要您自己实现 - 容器将为您解决它。
这意味着,每当您需要 TMyObject
的实例时,您不再直接请求它(从容器)。相反,您确实请求 IFactory<TComponent, TMyObject>
的实例,其中TComponent
是 TMyObject
接受的唯一参数构造函数。
作为从另一个类注入(inject)构造函数的示例 TSomeClass
,(其中 TSomeClass
也是 TComponent
后代)它看起来像下面这样:
constructor TSomeClass.Create(const AMyObjectFactory: IFactory<TComponent, TMyObject>);
begin
fMyObjectInstance := AMyObjectFactory(Self);
end;
至少对我来说,这让事情变得容易多了。
关于delphi - Spring4d : Automatic factory with Owner : TComponent parameter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34280951/
如何将项目添加到自定义组件弹出菜单(右键单击),例如版本号? (来源:home.pl) 最佳答案 查看有关组件开发的系列: http://delphi.about.com/library/bluc/t
嗨,德尔福 XE2 TComponent有一个新的"Observers" property 。不幸的是,这方面的帮助条目是空的。有谁知道这个新属性有什么好处以及如何使用它?编辑:嗯,我知道它与 Liv
在我的TComponent中,有一个点我想监听按键事件并拦截ESC键并在我的组件中处理它,消耗/“吃”击键,因此所有者表单在该阶段不会处理它。就像在 TDragObject 中一样,当您开始拖动并按
与 Spring4d ,你可以像这样注册自定义工厂 aContainer.RegisterInstance>(function(aName : string):TMyObject begin
要求 TComponent 作为所有者来实例化某种对象似乎完全无关。为什么有这么多 Delphi 组件需要这个? 例如,TXMLDocument 需要一个 TComponent 对象来实例化。 为什么
我有一个如下所示的 TComponent 类派生类,尝试保存到 clientdataset blob 字段:(摘自网络,注明出处) type TSaveComponent = class(TCom
我经常使用 C++ RAD Studio 和 Builder 6,并且在编写非可视化代码时经常动态创建表单或动态创建非可视化组件。在设计表单时,拖放到该表单上的组件的 Owner 属性会自动设置,因此
我对如何从具有 TPersistent 字段的 TComponent 中写出属性感到非常困惑。例如我有: TChildObj = class( TPersistent ) PRIVATE
在哪里可以找到 TComponent、TObject、TList 等的 API 文档?我正在将一些使用 C++ 生成器编写的 C++ 代码转换为 C#。我在查找这些类的相关文档时遇到了麻烦,无法找到
我创建了一个类 FormInfo = class (TComponent) private FLeftValue : Integer; FTopValue : Integer;
我是一名优秀的程序员,十分优秀!