Зачем вам использовать Dependency Injection Framework, если вы можете просто использовать следующий шаблон?
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 (но просто с подходом, описанным выше).