私は依存性注入の世界に飛び込んでいますが、問題に直面しています。状況は次のとおりです。
ImageGenerator
特定の状況で画像を生成するがあります。これImageGenerator
に、いくつかの文字列 (filePaths) とクラスを「コンストラクター注入」しますTranslator
。ImageGenerator
現在、とをインスタンス化する依存関係コンテナーを使用してこれを行っていますTranslator
。ここまでは順調ですね。
ImageGenerator 内new Imagick(...)
で、いくつかの場所をハードコーディングしました。これらの依存関係も注入する方法を探しているので、将来別のイメージ クラスに切り替えることができます。このために、2 つのクラスを使用して抽象化を作成しましたImagickImage
。GDImage
これらは両方とも で定義された一連のメソッドを実装しImageInterface
ます。
問題は、どのようにして正しいのインスタンスを取得ImageInterface
するのImageGenerator
ですか? いくつかのオプションを思いつきましたが、どちらも正しくないと感じています。
誰でも私を啓発できますか?
オプション #1、ImageFactory クラスを使用する
ImageGenerator
インターフェイスを実装するオブジェクトに注入できImageFactory
ます。ImageFactory
インターフェイスには、 の新しいインスタンスを返すメソッドがinstantiate($filePath)
ありますImageInterface
。問題は、このように多くのクラスとインターフェースになってしまうことです:
ImageInterface
, ImagickImage
, GDImage
, ImageFactoryInterface
, . ImagickImageFactory
_GDImageFactory
オプション #2、ImageInterface で静的ファクトリ メソッドを使用する
ファクトリのメソッドは 1 行だけになるので、クラスに静的メソッドをinstantiate
追加できると考えました。次に、インスタンスをImageGenerator に挿入するだけで、新しいインスタンスを作成するファクトリとして機能します。instantiate
ImageInterface
ImageInterface
オプション #3、イメージのクラス名を挿入する
画像クラスのクラス名 (ImagickImage
またはGDImage
) をクラスに挿入することもできImageGenerator
ます。次に、そのクラス名に基づいて新しいインスタンスを作成できます。
オプション #4
?