gpt4 book ai didi

Delphi依赖注入(inject): Framework vs Delegating Constructor

转载 作者:行者123 更新时间:2023-12-03 14:40:31 25 4
gpt4 key购买 nike

当您可以简单地使用以下模式时,为什么还要使用依赖项注入(inject)框架?

unit uSomeServiceIntf;

interface

type
ISomeService = interface
procedure SomeMethod;
end;

var
CreateSomeService: function: ISomeService;

implementation

end.
<小时/>
unit uSomeServiceImpl;

interface

type
TSomeService = class(TInterfacedObject, ISomeService)
procedure DoSomething;
end;

function CreateSomeService: ISomeService;

implementation

function CreateSomeService: ISomeService;
begin
Result := TSomeService.Create;
end;

procedure TSomeService.DoSomeThing;
begin
...
end;

end.
<小时/>
unit uInitializeSystem;

interface

procedure Initialze;

implementation

uses
uSomeServiceIntf,
uSomeServiceImpl;

procedure Initialze;
begin
uSomeServiceIntf.CreateSomeService := uSomeServiceImpl.CreateSomeService;
end;

end.

我试图掌握使用框架而不是这样做的好处,但到目前为止我只看到这种简单方法的好处:

1) 参数化构造函数更容易实现。例如。: 变量 CreateSomeOtherService:函数(aValue:字符串);

2)更快(无需在容器中查找)

3)更简单

这就是我使用它的方式:

unit uBusiness;
interface
[...]
implementation

uses
uSomeServiceIntf;
[...]
procedure TMyBusinessClass.DoSomething;
var
someService: ISomeService;
begin
someService := CreateSomeService;
someService.SomeMethod;
end;

end.

您使用 DI 框架而不是这种方法的理由是什么?

使用 DI 框架会是什么样子?

据我所知,如果您使用 DI 框架,那么您将针对接口(interface)注册具体类,然后系统的使用者会询问给定框架的实现。所以会有一个注册调用:

DIFramework.Register(ISomeInterface, TSomeInterface)

当您需要 ISomeInterface 实现时,您可以向 DI 框架询问:

var
someInterface: ISomeInterface;
begin
someInteface := DIFrameWork.Get(ISomeInterface) as ISomeInterface;

现在显然,如果您确实需要传递参数来创建 ISomeInterface,那么使用 DIFramework 整个事情会变得更加复杂(但使用上述方法很简单)。

最佳答案

在您的情况下,您必须在设计时提前知道工厂函数 ptr (var CreateSomeService) 的名称。当然,接口(interface)和函数 ptr 在同一个 Delphi 单元文件中耦合在一起,但这只是 Delphi 的遗留物,全局 var 不是线程安全的,也不受访问保护。

如果您在运行时获得了一个接口(interface),作为某些函数或从配置文件中读取的结果,该怎么办 - 您不知道要调用哪个工厂函数来获取实现者的实际实例。

DIFrameWork.Get(ISomeInterface) as ISomeInterface 对您隐藏工厂函数,因此您只需要接口(interface),而不需要接口(interface)和工厂函数。如果您想隐藏工厂函数,那么您还必须隐藏参数。 (最终会得到类似于 DI 框架的东西)。

关于Delphi依赖注入(inject): Framework vs Delegating Constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5945054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com