3

これらのインターフェイスがある場合:

ISequencer = interface;
IController = interface;

それらの実装(コントローラーには、コンストラクターインジェクションによるシーケンサーが必要です):

TSequencer = class(TInterfacedObject, ISequencer)
end;

TController = class(TInterfacedObject, IController)
  constructor Create(Sequencer: ISequencer);
end;

実装をグローバルコンテナに登録します。

GlobalContainer.RegisterType<TSequencer>.Implements<ISequencer>;
GlobalContainer.RegisterType<TController>.Implements<IController>;

GlobalContainer.Build;

IControllerそして最後に、自動配線機能を使用して、インターフェイスの新しいインスタンスを取得できます。

Controller := ServiceLocator.GetService<IController>;

実際のアプリケーションコードは問題ありません。しかし、テストプロジェクトでは、モックを作成したいと思いISequencerます。テストによっては、コンテナにの実装を要求するときにISequencer、実際の実装(TSequencer)が必要な場合と、模擬実装(のようなTSequencerMock)が必要な場合があります。この切り替えを行うにはどうすればよいですか?

4

1 に答える 1

4

特定のインターフェースに複数の実装を登録できます。次に、それらを名前で呼び出します。

GlobalContainer.RegisterType<TSequencer>.Implements<ISequencer>('real');
GlobalContainer.RegisterType<TController>.Implements<IController>('mock');

そして、必要に応じて名前で呼び出すことができます。

Controller := ServiceLocator.GetService<IController>('mock');

私はここでそれを行う方法についての記事を書きました:

http://www.nickhodges.com/post/Getting-Giddy-with-Dependency-Injection-and-Delphi-Spring-9-%E2%80%93-One-Interface-Many-Implementations.aspx

于 2013-02-07T16:59:45.430 に答える