1

私はInversion of Controlに、具体的にはGuiceRoboGuiceをAndroid用に使用しています。質問があります。コントロールの逆転新しいオブジェクトの作成

私はリソース(本質的にXMLまたはJSONストリングです)を返すメソッド呼び出しを持っています。

public Resource getResource(){ 
// Some implementation details that call a web service and throw the result in a string... 
String resource = ........ 
} 

Resourceクラスは、本当にただラップStringあるので、私はそれはそれはResourceオブジェクトの本質的な部分であるため、コンストラクタでそれを渡すために意味を成していた考え出しました。

public class Resource{ 
    Resource(String theXMLorJSON){ 
    ... 
    } 
} 

質問のカップル:

  1. にはどうすればいいgetResource呼び出しで新しいResourceを構築するのですか?私はIoCを使い、newメソッドにコールしないと思うだろう。
  2. 他のクラスがコンストラクタ内でResourceを受け取った場合、Stringの作成時に、Guiceコンテナを使用して構築するにはどうすればよいでしょうか?私はちょうどsimilar questionを尋ね、Guiceを使ってこれを扱う特定の方法があると信じています。

ありがとうございます!

答えて

2

あなたは依存性注入について何か誤解しているかもしれないと思います。 newにすべて使用しないようにする必要はありません。の場合...主に、newを使用してテスト用に模擬することができないようにしたいと考えています。そのようなオブジェクトに依存する任意のクラスを配線することができます。

あなたのResourceクラスは、単純な値オブジェクトのように聞こえるため、あなたが行うテストで簡単に手動で作成できます。それはまた、どんな種類のサービスにも依存しません...それはただStringを含んでいます。コンテナに作成させるようにする理由はありません。

getResource()メソッドを含むクラスは、実際にWebサービスを呼び出すことなくテストでそのクラスに依存するものを使用できるようにするために、コンテナを作成してください。 。

コンテナによって注入する必要がある依存関係と実行時にのみ認識されるパラメータの両方を使用するコンストラクタを持つクラスを使用する場合、特定の種類の中間的なファクトリを作成する必要がありますランタイムパラメータ。 Guiceを使用すると、Assisted Inject(RoboGuiceで動作するかどうかはわかりませんが、手動でそのようなファクトリ実装を作成することは簡単です)を使用して、そのようなファクトリをインターフェイスから自動的に作成できます。

+0

お返事ありがとうございました。私はまた、アーリントン、バージニア州、btwです。 – skaz

+0

あなたが気にしない場合は、さらに2つの質問があります。 1)あなたがリンクしているページの "手作りの工場"セクションの例が、単に「CreditService」の代わりに「プロバイダ」になるのはなぜですか? 'CreditService'だけを注入できませんでしたか? 2)コンストラクタで 'Resource'を取る' ResourceUser'クラスと、 'Resource'コンストラクタが' String'クラスを持っている場合、Guiceで 'ResourceUser'を設定するにはどうすればいいですか?残念ですが...。 – skaz

+0

これは、工場が 'CreditService'のスコープを変更しないようにするためです。たとえば、「CreditService」はWebアプリケーションでリクエストスコープにすることができるため、ファクトリが呼び出されるたびに正しいインスタンスが得られるようにする必要があります。すべての依存関係がシングルトンの場合、それらを直接注入することはできますが、工場ではそれを想定してはいけません。 [Injecting Providers](http://code.google.com/p/google-guice/wiki/InjectingProviders)を参照してください。 – ColinD

関連する問題