Как мне получить текущий номер строки при обработке файла?

Зачем вам использовать фреймворк внедрения зависимостей, если вы можете просто использовать следующий шаблон?

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 (но простой с подходом, описанным выше).

11
задан menjaraz 21 June 2015 в 10:00
поделиться