ホームページ > バックエンド開発 > PHPチュートリアル > デザインパターンを備えたディスコ:依存関係の注入の新鮮な見方

デザインパターンを備えたディスコ:依存関係の注入の新鮮な見方

Christopher Nolan
リリース: 2025-02-15 13:14:13
オリジナル
592 人が閲覧しました

Disco with Design Patterns: A Fresh Look at Dependency Injection

コアポイント

  • 依存関係噴射(DI)オブジェクトの作成と使用を分離することにより、柔軟な依存関係管理を可能にします。
  • 依存関係噴射コンテナは、オブジェクトの依存関係の管理を簡素化します。特に、依存関係の数が膨大な場合、オブジェクトの作成と構成を自動化することで実装されます。
  • 注釈ベースのDIコンテナである
  • discoは、@Bean@Configurationなどの注釈で構成を簡素化し、サービスのセットアップを簡素化します。
  • ディスコは、シングルトンのインスタンス化、負荷の遅延、セッション/リクエストの範囲管理などの高度な機能をサポートし、リソースの使用率とサービスライフサイクルを最適化します。
  • SymfonyコンポーネントとのDiscoの統合は、最新のWebアプリケーション開発におけるDISCOの互換性と実用性を示す基本的なHTTPベースのフレームワークを作成するのに役立ちます。
  • この記事では、Discoを使用してDIパターンを実装し、開発者が効率的でスケーラブルで維持しやすいWebアプリケーションを構築するための基礎を築く実用的な例を示しています。

依存関係の注入の中核は、コードの再利用性にあります。これは、オブジェクトの作成/構成を使用状況から分離することにより、高度なコードの再利用性を向上させるために設計された設計パターンです。

Disco with Design Patterns: A Fresh Look at Dependency Injection

次のコードを検討してください:

class Test {

    protected $dbh;

    public function __construct(\PDO $dbh)
    {
        $this->dbh = $dbh;
    }

}

$dbh  = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$test = new Test($dbh);
ログイン後にコピー
ログイン後にコピー
ご覧のとおり、クラス内にPDOオブジェクトを作成する代わりに、クラスの外側で作成し、コンストラクターを介して依存関係として渡します。これにより、クラス内で定義されたドライバーを使用することなく、選択したドライバーを使用できます。

Alejandro GervasioとFabien TotencierはどちらもDiの概念の素晴らしい説明を提供します。

ただし、このパターンには1つの欠点があります。依存関係の数が増えると、従属オブジェクトに渡す前に多くのオブジェクトを作成/構成する必要があります。最終的には、多くのボイラープレートコードと、コンストラクター内のパラメーターの長いキューが生成される可能性があります。現時点では、注入容器を依存する必要があります!

依存関係噴射コンテナ(略してDIコンテナ)は、サービスを作成し、その依存関係を処理する方法を知っているオブジェクトです。

この記事では、この概念をさらに実証するために、新しいDIコンテナであるディスコを使用します。

依存関係噴射コンテナの詳細については、このトピックに関する他の記事を参照してください。

フレームワークはDIコンテナを展開する優れた例であるため、記事の最後にディスコといくつかのSymfonyコンポーネントを使用して、基本的なHTTPベースのフレームワークを作成します。

インストール

discoをインストールするには、通常どおりComposerを使用します:

コードをテストするには、PHPの組み込みWebサーバーを使用します。

class Test {

    protected $dbh;

    public function __construct(\PDO $dbh)
    {
        $this->dbh = $dbh;
    }

}

$dbh  = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$test = new Test($dbh);
ログイン後にコピー
ログイン後にコピー

その結果、アプリケーションはhttps://www.php.cn/link/7d7b04e989115e193107af57ad662dd2にアクセスできるようになります。ファイルはあります。 -tindex.php初心者

ディスコは、コンテナと相互運用可能なDIコンテナです。ディスコは、注釈に基づいたDIコンテナです。

パッケージには、コンテナオブジェクトの特性を標準化するためのインターフェイスのセットが含まれていることに注意してください。それがどのように機能するかを理解するには、独自のSitePoint依存関係噴射コンテナの構築に関するチュートリアルを参照してください。

container-interopコンテナにサービスを追加するには、構成クラスを作成する必要があります。このタイプは、container-interopアノテーションマーク:を使用する必要があります

各コンテナサービスは、構成クラスのパブリックまたは保護された方法として定義する必要があります。ディスコは、各サービスをJava文化に由来するBeanを豆と呼びます。 @Configuration

各メソッド内で、サービスの作成方法を定義します。各メソッドには
composer require bitexpert/disco
ログイン後にコピー
(これはサービスであることを意味します)でマークされている必要があり、returnオブジェクトのタイプには

注釈がマークされています。

これは、「Bean」を含むシンプルなディスコ構成クラスの例です。 @Bean @return

注釈は、サービスの性質を指定するためにいくつかの構成パラメーターを受け入れます。これらのパラメーターは、サービスがSingletonオブジェクトであるか、遅延ロード(オブジェクトがリソース集約型である場合)であるか、またはセッションの存続期間中に状態を持続するかを指定します。

デフォルトでは、すべてのサービスはSingleton Servicesとして定義されます。
php -S localhost:8000 -t web
ログイン後にコピー
たとえば、

次の豆はシングルトンの怠zyなロードサービスを作成します。 @Bean

DiscoはProxyManagerを使用してサービスの負荷を遅らせます。また、構成クラスのメソッドに追加の動作(注釈で定義)を注入するために使用します。

Configurationクラスを作成した後、

最後に、コンテナを
<?php
/**
 * @Configuration
 */
class Services {
    // ...
}
ログイン後にコピー

に登録します

コンテナからサービスを取得する方法AnnotationBeanFactory

discoはコンテナ/相互運用性と互換性があるため、コンテナオブジェクトで

およびBeanFactoryRegistryメソッドを使用できます。

<?php
/**
 * @Configuration
 */
class Configuration {

    /**
     * @Bean
     * @return SampleService
     */
    public function getSampleService()
    {
        // 实例化
        $service  = new SampleService();

        // 配置
        $service->setParameter('key', 'value');
        return $service;
    }
}
ログイン後にコピー

(以下のコンテンツは元のテキストに似ています。スペースを維持するために、ここではいくつかの詳細が省略されますが、重要な情報と構造は保持されます)

サービスの範囲get()has()

<?php
// ...

/**
 * @Bean({"singleton"=true, "lazy"=true})
 * @return \Acme\SampleService
 */
public function getSampleService()
{
    return new SampleService();
}

// ...
ログイン後にコピー
コンテナパラメーター

ディスコの実用的なアプリケーション

応答リスナーを作成

結論

この記事は、元のテキストの擬似オリジナル処理のみであり、微妙な調整と書き換えのコンテンツを作成し、元のテキストの一般的な意味を変えることなく、記事をよりスムーズで自然にするよう努めています。画像形式と位置は変更されていません。

以上がデザインパターンを備えたディスコ:依存関係の注入の新鮮な見方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート