4

1つのZF2システムには多くのコンポーネントがあります。各コンポーネントには、独自のプレゼンテーション層、ビジネス層、およびデータ層があります。問題は、コンポーネントFooにコンポーネントBarのデータレイヤーを使用するコントローラーがある場合です。

例:

<inside modules, each module can be individually deployed or removed>
\modules
   \Foo                  ; one module (this directory) can be added or removed
     \view               ; presentation layer (view) for all subcomponents
        \Subcomponent1
            \Action1
        \Subcomponent2
            \Action2
        ...
     \src
        \Subcomponent1
            \Entity      ; data layer     (model)
            \Controller  ; business layer (controller)
            \Service     ; service layer  (service)
        \Subcomponent2
            \Entity
            \Controller
            \Service
        \Subcomponent3
            ...
  \Bar
     \view
         ...
     \src
         \Subcomponent1
            ...
  \Baz
     \src
         \Subcomponent1
            ...

サブコンポーネントは、他のサブコンポーネントのエンティティと強力に結合されており、多くの場合、完全に異なるコンポーネントからのものです。これは、コントローラーとサービスの場合です。これは解決できますか?

Foo \ Subcomponent1にはFooSub1Serviceがあり、Bar \ Subcomponent1のエンティティを使用して、渡されたデータを処理し、DBにインポートします。Baz \ Subcomponent1には、Bar\Subcomponent1エンティティを使用してIDなどでユーザーを検索するAuthenticationServiceがあります。

私は依存性注入を知っていますが、この場合、すべてのサブコンポーネントにEntityManagerがあり、名前とPK、つまりfind( "Bar \ Subcomponent1 \ Entity \ User"、123)でエンティティを検索するように指示されています。また、エンティティを永続化するときは、外部キーを持つもの、つまりUserAddressをインスタンス化して、それをUserに追加する必要があります。x = new NameOfEntity()を呼び出すたびに、サブコンポーネントを、多くの場合別のシステムモジュールからのサブコンポーネントのエンティティと緊密に結合します。

4

3 に答える 3

7

ZF2では、を使用してモジュール間の結合を減らすことができます。こちらEventManagerも参照してください。

さらに、ファサードmodule/config/module.config.phpとして機能します。

すべてのエンティティは、任意のモジュールのmodule/config/module.config.phpファイルで1回定義できます。その後、他のモジュールはを使用しServiceManagerて依存関係を解決できます。

ServiceLocatorパターンServiceManagerを実装します。

ファサード(module.config.php)とEventManager、を使用すると、モジュール間の結合が正常に削減されました。

于 2012-11-26T09:48:13.500 に答える
0

すべての依存関係を常に削除できるとは限りません。たとえば、認証モジュールは通常、何らかの形式のユーザー資格情報に依存します。

特定のクラスとの結合を減らすために実行できる1つのアプローチは、アダプターを使用して依存関係を置き換えることを許可することです。

たとえば、認証モジュールと一緒にさまざまなタイプのユーザーモジュールを使用できるようにする場合は、認証モジュールにインターフェイスを定義できます。このインターフェイスは、ユーザーモジュールとの互換性を保つために、ユーザーモジュールのアダプターによって実装する必要があります。それ。次に、認証モジュールに構成オプションを追加します。これにより、ユーザーは使用するユーザーアダプターの実装を変更できます。

複雑さに応じて、アダプタを使用するのではなく、オブジェクト自体に特定のインターフェイスを定義することもできます。ただし、これにより、関連のない関数などがオブジェクトに追加され、実装が理解しにくくなる場合があります。

最後に、このような柔軟性をコードに実装しようとしないことをお勧めします。モジュールを世界と共有する予定がない限り、これが必要になる可能性はほとんどありません。通常、完全に新しいインターフェイスやクラスを作成するよりも、モジュール内のハード依存関係のある数行のコードを変更する方がはるかに簡単だからです。 。これは明らかに、モジュールの使用計画に基づいて自分自身を評価する必要があるものです。

于 2012-11-25T18:53:33.153 に答える
0

エンティティまたはリポジトリに直接アクセスしないでください。モジュールごとに1つ以上のサービスを実装し、それを明確にするためのインターフェイスを提供できます。

ORM Doctrine 2のようにデータ層に使用する場合、各モジュールのすべての/entityフォルダーはとにかく共有されます。これにより、1つのリポジトリで結合を行い、結合されたエンティティを取得することが可能になります。悪くない。

依存関係を減らすことだけを目的としてイベントマネージャーを悪用しないでください。共有サービスを使用し、それらのみを操作します。

アプリケーション全体を呼び出して物を収集したり、回答が必要な場合は、イベントマネージャーを使用します。

于 2014-11-27T17:37:07.480 に答える