4

明確にしたい依存性注入に関する問題がいくつかあります。最初に言及するのは、私が実装した依存性注入コンテナー (DIC) です。これは、ReflectionClassを使用してコンストラクターを介して依存関係を登録および解決できます。

$container = new DiC;
$container->register('session', 'CSession');
$container->register('response', 'CResponse');
$container->register('model', 'CSomeModel');
$container->register('view', 'CSomeView');
$container->register('controller', 'CSomeController');

依存コントローラー:

class CSomeController extends CController
{
  public function __construct(CSomeModel $model, CSomeView $view)
  {
    // assign arguments here
  }
}

これで、DIC を使用してコントローラーをインスタンス化できます。

$controller = $container->resolve('controller');

このアプローチは自動化されていてわかりやすいので気に入っていますが、クラス CController は特定のクラス CSomeModel、CSomeView に依存しており、これは良くありません。MVC トライアドは個別にインスタンス化する必要があります。たとえば、COtherView を CSomeController に渡すことはできません。

私の 2 番目の推測は、DIC を挿入することです。

class CSomeController extends CController
{
  public function __construct(DiC $dic)
  {
    // resolve dependencies through $dic
  }
}

これは DiC オブジェクトをグローバルにします。多くの人は、これは DI を実装する方法ではないと主張しています。

両方のアプローチの弱点を解消する第 3 の方法はありますか?

4

2 に答える 2

1

「自動配線」を探している場合は、インターフェイスに切り替えて、具体的なモデル/ビューなどを実装します。そのインターフェイスに対するクラス。そうすれば、反射を使用して両側をペアにすることができます。

また、コンテナー レベルで依存関係を明示的に指定するメカニズムを用意することも理にかなっています。

于 2013-05-04T01:20:24.693 に答える
1

どちらのアプローチも適切だと思います。最初のアプローチでより柔軟にしたい場合は、コンストラクターを変更して、親クラスを依存関係として持つことができます。次に、その親クラスから継承するすべてのオブジェクトを注入できます。いえ

class CSomeModel extends AbstractCModel {}
class CSomeOtherModel extends AbstractCModel {}

public function __construct(AbstractCModel $model, AbstractCView $view) {}

2 番目の方法は、工場にアクセスする必要がある場合に適しています。つまり、同じオブジェクトの複数のインスタンスにアクセスする必要がある場合です。

于 2013-04-24T17:01:32.850 に答える