3

私は自分のCacheクラスを使用するクラス/メソッドを持つカスタム フレームワークを持っています。

現在、密結合されています。したがって、メソッドは次のCacheようにクラスをインスタンス化します。

public function someMethod ( )
{
    $cache = new Cache\HHCache();
}

タイトカップリングを外したいのですが、実際には少し行き詰まっています。

ServiceProviderある種のクラスを作成するのは良い考えだと思いました。しかし、これが本当に正しいアプローチであるかどうかはわかりません。

開始するには、キャッシュクラスが定義されHHConfigているプロパティを持つファイルがあります。static要するに:

class HHConfig
{
    static $_cacheClass = '\Core\Cache\HHCache';
}

基本的に、フレームワークのコア機能の一部であるこのようなクラスがあります。

interface IHHServiceProvider
{
    public function getService ( );
}

次に、これを実装する別のクラスがありますinterface

class HHCacheProvider implements IHHServiceProvider
{
    public static function getService ( )
    {
        $class = HHConfig::$_cacheClass;
        return new $class();
    }
}

これで、クラスをsomeMethod使用してHHCacheProviderクラスのインスタンスを取得できますCache

public function someMethod ( )
{
    $cache = HHCacheProvider::getService ( );
}

MyIHHServiceProviderは、実際にはProvider何も登録できないため、典型的なクラスとはまったく異なりますServicesHHConfigロードする「クラス」をクラスで調べ、そのインスタンスで返すだけです。

どういうわけか、この方法は私には適切ではありませんが、私が達成したいことを示していると思います. どのような方法でこれを改善できますか?


このための単純な依存性注入パターンを探しているわけではないことに注意してください。Cacheクラスをすべてのコンストラクタークラスに注入したくないからです。メソッド内から何らかの形でクラスのインスタンスを取得する非密結合の方法が必要です。HHCache

私のフレームワークの一部になることができるある種のプロバイダー クラスは、正しい方向のようです。

4

2 に答える 2

2

注:「プロバイダー」には意味がありません。その名の通り柄はありません。

魔法の「プロバイダー」を作成する代わりに、ファクトリ パターンを確認する必要があります。基本的には次のような考え方です。

  1. Cacheいくつかのサービスを使用するクラスにファクトリを注入します (それが目的のサービスの唯一の形式ではないことを前提としています)。

  2. 必要なサービスをファクトリから要求するクラス:

    • ifサービスはすでに一度初期化されているため、インスタンスをあなたのサービスに返すだけです
    • else新しいインスタンスを作成して保存し、「消費者」に返します

最も単純なコード例は次のようになります。

class ServiceFactory
{
    private $storage = [];

    public function create( $name )
    {
        if ( false === array_key_exists( $name, $this->storage ))
        {
            $instance = new $name;
            $this->storage[$name] = $instance;
        }

        return $this->storage[$name];
    }

}

これは非常に単純化された例ですが、この場合でも、このファクトリのインスタンスを任意の数のオブジェクトに注入すると、それらはすべてインスタンスの同じプールにアクセスできます。

DI Containersの概念を検討することに決めた場合、ファクトリは、サービス ロケータのアンチパターンとして劣化することなく、それらを利用するのに適した場所でもあります。

..そして、価値があると思われるいくつかの講義:

于 2013-04-11T21:43:26.860 に答える