私は依存性注入の世界に飛び込んでいますが、問題に直面しています。状況は次のとおりです。
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 に挿入するだけで、新しいインスタンスを作成するファクトリとして機能します。instantiateImageInterfaceImageInterface
オプション #3、イメージのクラス名を挿入する
画像クラスのクラス名 (ImagickImageまたはGDImage) をクラスに挿入することもできImageGeneratorます。次に、そのクラス名に基づいて新しいインスタンスを作成できます。
オプション #4
?