Зачем вам использовать фреймворк внедрения зависимостей, если вы можете просто использовать следующий шаблон?
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) Параметризованные конструкторы легче реализовать. Например:
Зачем вам использовать структуру внедрения зависимостей, если вы можете просто использовать следующий шаблон?
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) Параметризованные конструкторы проще реализовать. Например:
Зачем вам использовать структуру внедрения зависимостей, если вы можете просто использовать следующий шаблон?
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: function (aValue: string);
2) Быстрее (нет необходимости в поиске в контейнере)
3) Упрощение
Вот как я бы его использовал:
unit uBusiness;
interface
[...]
implementation
uses
uSomeServiceIntf;
[...]
procedure TMyBusinessClass.DoSomething;
var
someService: ISomeService;
begin
someService := CreateSomeService;
someService.SomeMethod;
end;
end.
Каковы ваши аргументы в пользу использования структура DI вместо этого подхода?
Как это будет выглядеть при использовании структуры DI?
Насколько я знаю, если бы вы использовали структуру DI, то вы бы зарегистрировали конкретный класс для интерфейса, а затем потребителей система запросит реализацию для данной структуры. Таким образом, будет регистрационный вызов:
DIFramework.Register(ISomeInterface, TSomeInterface)
, и когда вам понадобится реализация ISomeInterface, вы можете попросить об этом структуру DI:
var
someInterface: ISomeInterface;
begin
someInteface := DIFrameWork.Get(ISomeInterface) as ISomeInterface;
Теперь очевидно, что если вам действительно нужно передать параметры для создания ISomeInterface, все становится более сложным с DIFramework (но простой с подходом, описанным выше).