2017-01-31 16 views
0

今、私がプレイ使用依存性注入されたコントローラを作るには、2つの方法があります。このPlayFramework:コントローラとの依存関係インジェクションの関係

のようにDIを説明PlayFrameworkの公式ドキュメントを読んでいます。

私はそれらがどのように関連しているか分かりません。どういう意味ですか? DIのコンセプトをコントローラに入れる必要があるのはなぜですか? 誰でも説明できますか?

答えて

1

以前のバージョンのPlayでは、コントローラに静的メソッドがありました。これは、静的なコントローラがコードやサービスオブジェクトを簡単に共有できなかったため、静的なコードやシングルトンのいずれかにつながります。これはまた、必要以上にテストを困難にしました。

依存型注入コントローラに移行することで、(以前のクラスベースのアプローチの代わりに)オブジェクトベースのものをすべて使用できるようになり、共有インスタンスまたは専用コードをコントローラに渡すことができます。

いくつかの種類のアイテムを管理するアプリを想像してみてください。アイテムはデータベースに格納されるため、いくつかの設定が必要です。

public class StaticController extends Controller { 
    // active record approach 
    public static Result getItems() { 
     // static call to Item 
     List<Item> items = Item.findAll(); 
     // do other stuff 
    } 
} 

これをテストする場合、StaticControllerItemが密結合されています。これをDIを使用する手法と比較すると、DAOはその結合を取り除くことができます。

public class InjectedController extends Controller { 
    private final ItemDao itemDao; 

    public InjectedController(final ItemDao itemDao) { 
     this.itemDao = itemDao; 
    } 

    public Result getItems() { 
     // static call to Item 
     List<Item> items = itemDao.findAll(); 
     // do other stuff 
    } 
} 

ItemDaoをインタフェースとすることができるため、カップリングだけで非常に簡単にするので、大規模の減少とテストです。

+0

ありがとうございました。静的なコントローラメソッドを使用しても、ファクトリメソッドのように使用できます。 'item.findAll()'の代わりに 'List items = Items.use()。findAll()'と書くことができます。 'use()'メソッドは静的メソッドで、 'Item'のインスタンスだけを返します。 。このように実装すると、アプリに何が間違っていますか?通常、私はこのアプローチを取っているので、このアプローチと比べて、私はDIを使ったアプローチの利点を知りたいと思います。 –

+0

このアプローチでは「間違った」ものは何もありませんが、 'Items.use()'は静的呼び出しであり、何かのインスタンスを返してもテストするのが難しいです。このアプローチでは、 'Items.use()'で表されるオブジェクトをコントローラに直接注入するのではなく、余分なレイヤーを追加することもできます。また、リクエストごとにアプローチすることにより、スコープをより簡単に制御することもできます。アクターを使用している場合は、ActorRefをコントローラーに挿入することもできます。アクターの静的メソッドを呼び出すのは無意味です。 –

+0

私はこの問題を解決したと思っていましたが、不明なことが今私に起こりました。もともと、コントローラ自体はテスト可能ではないので、セレンを採用して時々テストします。しかし、あなたはPlayがDIのコンセプトをコントローラーに導入してテストを容易にすると言っています。通常のケースでは、 'dependency注入コントローラ 'を使用するときに、どのようにコントローラをテストしますか? –

関連する問題