- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想给对象注入(inject)接口(interface)但是找不到属性[Inject]的问题
什么有效。
unit uStorage;
interface
uses
uStorageInterface;
type
TStorageService = class (TInterfacedObject, IStorageService)
private
FPath: String;
procedure SetPath(const Value: String);
function GetPath: String;
public
property Path: String read GetPath write SetPath;
end;
implementation
{ TStorageService }
function TStorageService.GetPath: String;
begin
Result:= FPath;
end;
procedure TStorageService.SetPath(const Value: String);
begin
FPath := Value;
end;
<小时/>
unit uStorageInterface;
interface
type
IStorageService = interface
['{F1B4C339-BE8E-4182-A191-95266160FA6E}']
procedure SetPath(const Value: String);
function GetPath: String;
property Path: String read GetPath write SetPath;
end;
IStorageObject = interface
['{7B97B659-EDF3-4892-AFAB-985487660372}']
end;
implementation
end.
<小时/>
unit uObjects;
interface
uses
Vcl.StdCtrls,
System.Classes,
uStorageInterface,
Spring.Container,
Spring.Services,
Spring.Container.Common;
type
TMyButton= class (TButton, IStorageObject)
private
FStorage: IStorageService;
function GetStorage: IStorageService;
protected
procedure DoExit; override;
public
constructor Create(AOwner: TComponent); override;
end;
implementation
{ TMyButton }
constructor TMyButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FStorage:= ServiceLocator.GetService<IStorageService>;
end;
procedure TMyButton.DoExit;
begin
inherited;
if assigned(FStorage) then
begin
self.Caption:= FStorage.Path;
end;
end;
function TMyButton.GetStorage: IStorageService;
begin
Result:= FStorage;
end;
end.
<小时/>
unit Unit2;
interface
uses
System.SysUtils, System.Classes,
Vcl.Dialogs;
type
TDataModule2 = class(TDataModule)
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
DataModule2: TDataModule2;
implementation
uses
uStorage,
uObjects,
uStorageInterface,
Spring.Services,
Spring.Container;
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
procedure TDataModule2.DataModuleCreate(Sender: TObject);
begin
GlobalContainer.RegisterType<TStorageService>.Implements<IStorageService>.DelegateTo(
function: TStorageService
begin
Result := TStorageService.Create();
Result.Path:= 'MyButton';
end).AsSingleton;
GlobalContainer.Build;
end;
end.
在构造函数 TMyButton.Create(AOwner: TComponent) 中,我想用字段注入(inject)替换 ServiceLocator,但我找不到如何执行此操作。
一些例子,但它不起作用。我看不出问题所在。
unit uObjects;
interface
uses
Vcl.StdCtrls,
System.Classes,
uStorageInterface,
Spring.Container,
Spring.Services,
Spring.Container.Common;
type
TMyButton= class (TButton, IStorageObject)
private
[Inject]
FStorage: IStorageService;
function GetStorage: IStorageService;
protected
procedure DoExit; override;
public
constructor Create(AOwner: TComponent); override;
end;
implementation
{ TMyButton }
constructor TMyButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
//FStorage:= ServiceLocator.GetService<IStorageService>;
end;
procedure TMyButton.DoExit;
begin
inherited;
if assigned(FStorage) then
begin
self.Caption:= FStorage.Path;
end;
end;
function TMyButton.GetStorage: IStorageService;
begin
Result:= FStorage;
end;
end.
<小时/>
procedure TDataModule2.DataModuleCreate(Sender: TObject);
begin
GlobalContainer.RegisterType<TStorageService>.Implements<IStorageService>.DelegateTo(
function: TStorageService
begin
Result := TStorageService.Create();
Result.Path:= 'MyButton';
end).AsSingleton;
GlobalContainer.RegisterType<TMyButton>.Implements<IStorageObject>.InjectField('FStorage');
GlobalContainer.Build;
end;
当我在运行时创建 TMyButton 时,TMyButton 中的 FStorage 为空。当我使用 FStorage:= ServiceLocator.GetService; 时然后在构造函数中分配 FStorage。但我想使用注入(inject)而不是 ServiceLocator。如果可能的话。
最佳答案
首先注册TMyButton
是错的。容器本身不会为 AOwner 填充 nil。这意味着它将回退到 TObject 构造函数,使按钮实例保持一半初始化状态。
要么使用子依赖解析器为 TComponent 构造函数执行此操作,要么以这种方式显式注册它。
GlobalContainer.RegisterType<TMyButton>.Implements<IStorageObject>
.DelegateTo(
function: TMyButton
begin
Result := TMyButton.Create(nil);
end)
.InjectField('FStorage');
现在注意!如果您在某处将其解析为 TMyButton,则容器不知道如何解析该问题,因为您将 IStorageObject 指定为服务类型。如果指定服务类型,除非显式定义,否则容器不会解析该类。然而,这里有一个小故障,因为容器在解析该类时会尝试再次注册该类。这会导致 TMyButton 的第二次注册,但未指定字段注入(inject)。我会解决这个问题。
在此之前,您可以通过添加 Implements<TMyButton>
来解决此问题到您的注册。
关于delphi - 如何将字段接口(interface)注入(inject)到对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30345602/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!