2017-11-03 7 views
1

私は自分の問題に適用するのに最適なパターンを探しています。私は私のサービスクラスの機能を定義するインタフェース依存性注入を使用してクラスに機能を追加する

interface NegotiationInterface { 
    abstract public function resetNegotiation(Negotiation $negotiantion); 
} 

メインクラスは、それを実装した

public class NegotiationService implements NegotiationInterface { 

    public function __construct(…Some Dependencies…) 
    { 
    ….   
    } 

    public function resetNegotiation(Negotiation $negotiantion){ 
    …. //All business logic 
    } 
} 

NegotiationServiceはDIコンテナの下で登録(symfonyはベース)と、そのサービスIDによってすべてのアプリケーションにわたって使用されています。

$negotiationService = $this->container->get(“negotiation_service”); 
$negotiationService->resetNegotiation($negotiation); 

、お客様のしかし、いくつかの(ネゴシエーションはクライアント情報が含まれている)、Webサービスを呼び出す私たちの共通のビジネスロジック+例えば、resetNegotiationを呼び出した後、追加のステップが必要です。私はデコレータパターンに達しましたが、DIを使用している最善の方法であるかどうかはわかりません。もしそうなら、私はどのようにDIと一緒に申請しますか?私はクライアントに応じて動的にロードされた余分なステップを持っていたいと思います。

+0

この時点で、あなたの質問には2つの良い答えがあります。それらを見て、あなたを助けた答えがあればそれを受け入れてください。代わりに、答えをより明確にするためにコメントしてください。つまり、私はあなたのケースではうまくいくはずだと思うコンポジットパターンの例を提供しました。 – CKing

答えて

1

私はそのようなクラスを仕事で多くする必要があります。私たちは通常アダプターを使います(私がデザインパターンに間違っている場合は私に修正してください)。 (私はコンストラクタで誰もが使用する「ジェネリック」NegotiationServiceを追加

public class NegotiationServiceAdapter implements NegotiationInterface { 

    protected $negotiationService; 

    public function __construct(NegotiationService $negotiationService) 
    { 
     $this->negotiationService = $negotiationService; 
    } 

    public function resetNegotiation(Negotiation $negotiation){ 
     $this->negotiationService->resetNegotiation($negotiation); 

     //Rest of your custom code for that client 
    } 
} 

お知らせをして、実現される機能では、最初に、このインスタンスのコードを実行:あなたのケースでは、アダプタは次のようになります。または最後に、あなたのケースに依存します)、そしてあなたのカスタムコード。

+0

私は顧客クライアントAとBを持っているとしましょう。クライアントAはWebサービスメソッドを呼び出し、Bはファイルをエクスポートする必要があります。どのように私はそれを実装するだろうか?私はデコレータについて考えていたが、それについてはわからない。交渉A、交渉B交渉を注入する。 – dextervip

+0

@dextervipあなたがデコレータのパターンに行くことを決めたとき、あなたは近くにいました。より良いアプローチのために私の答えを見てください。 – CKing

0

私はDecoratorパターンに達したが、私はと比較してComposite pattern DI

を使用すると、このユースケースのためのより良いフィットするだろうが、それが最善のアプローチであるかどうかわかりませんデコレータパターン。私はあなたのコードを次のように変更します:

  1. NegotiationInterfaceNegotiationServiceexecuteからresetNegotiation方法の名前を変更します。
  2. arrayまたはlistNegotiationInterfaceインスタンスを保持できる)をインスタンス変数としてNegotiationServiceに追加します。
  3. NegotiationServiceでコンストラクタを作成し、追加のlist/arrayパラメータを要求し、コンストラクタで初期化します。 NegotiationServiceexecute方法において

  4. 、リストを反復し、その中に各NegotiationInterfaceexecuteを呼び出します。 NegotiationInterfaceのあなたは上記の変更を行ったら

、あなたが作成することができます異なる実装がarray/listにそれらを追加し、単に1によって各インスタンス1を反復処理し、それぞれにexecuteを呼び出しますNegotiationServiceにこれを渡しますのインスタンス。例えば

$resetNegotiation = new ResetNegotiationNegotiationInterfaceImpl(); 
$callWebservice = new CallWebServiceNegotiationInterfaceImpl(); 
$negotiationInterfacesClient1 = array($resetNegotiation, $callWebservice); 
$negotiationServiceClient1 = new NegotiationService($dependencies, $negotiationInterfacesClient1); 
negotiationServiceClient1.execute($negotiation); 

$exportFile = new ExportFileNegotiationInterfaceImpl(); 
$negotiationInterfacesClient2 = array($resetNegotiation, $exportFile); 
$negotiationServiceClient2 = new NegotiationService($dependencies,$negotiationInterfacesClient2); 
negotiationServiceClient2.execute($negotiation); 

  • ResetNegotiationNegotiationInterfaceImplNegotiationInterfaceを実装し execute方法でサービスをリセットするコードを含んでいます。これはclientclient2によって再利用されます。
  • CallWebServiceNegotiationInterfaceImplNegotiationInterfaceを実装し、 のexecuteメソッドでWebサービスを呼び出すコードを含んでいます。
  • ExportFileNegotiationInterfaceImplNegotiationInterfaceを実装し、 executeメソッドでファイルを書き出すコードを含んでいます。
関連する問題