2016-06-12 1 views
1

依存性注入と2.5 Scalaのインポートクラスを再生する:この注射の使用機能で、私は依存性注入とクラス<strong>アピ</strong>を持って

class Api @Inject()(userRepo: UserRepo) extends Controller { 
    def user(email: String) ={ 
    userRepo.getUser(email).map(....) 
    } 
} 

と同じパッケージ内のオブジェクトFlashSessionを - 私は他の多くのファイルでそれを使用しています。 私のobj ユーザを私のobj FlashSessionに使用したいと思います。

object FlashSession { 
    def test = ... Api.user("[email protected]") .... 
} 

しかし、それはクラスではなくオブジェクトであるので、私はアピクラスをインポートすることはできません、それはDIが必要なので、私はcompagnonオブジェクトにこの機能を置くことはできません。

これを処理するにはどうすればよいですか?

ありがとうございました!

答えて

1

あなたはFlashSession

object FlashSession { 
    def test = new Api(new UserRepo()).user(...) 
} 

または

object FlashSession { 
    def test(userRepo: UserRepo) = new Api(userRepo).user(...) 
} 

の内側に、このApiクラスを作成することができますしかし、これはあなたが本当に欲しいものはおそらくではありません。特にデータベースのデータ操作には、DIでグローバルコンパニオンオブジェクトを使用しないでください。

+1

Apiクラスをコントローラとして使用していますので、ありがとうございますが、効果的です。しかし、私はあなたの答えを適応させることができ、それを使って何かをすることができます。 「DI付きグローバルコンパニオンオブジェクトを使用しない」とはどういう意味ですか?それは、あなたの解決策があまり良くないことを意味します。 – Lauriane

+0

はい、コンストラクタDIを使用すると、コードにいくつかの変更が必要です。必要なクラスをコンストラクターで渡し、次にグローバルオブジェクトを使用するだけです。 @ bruce-loweの答えは、このアプローチの良い洞察を示しています。 – liosedhel

1

Api.user( "email")はApiがクラスであり、オブジェクトではないため使用できません。 Javaでは、静的メソッドから非静的メソッドを呼び出すようです。理論的には、Apiのインスタンスが1つ以上、またはApiのインスタンスが1つ以上存在する可能性があります。したがって、オブジェクトFlashSessionでクラスApiを使用することは意味がありません。あなたがクラスにフラッシュを変更し、それがより良い動作するAPIクラスを注入した場合

class FlashSession @Inject()(api: Api) { 
    def test = ... api.user("[email protected]") .... 
} 

あなたはそれを使用するすべてのクラスにFlashSessionを注入する必要があります。

新しい開発者は、最も簡単なことからすべてをオブジェクトにし、DI(依存関係注入)を行わないことがあります。モックのようなものでより効果的なテストを可能にするために、DIを使用するように進化しています。しかし、DIやオブジェクトとのクラスのミックスやマッチングはうまくいかない。

+0

私はこのような質問をしたいと思っています。明らかにそうではありません...だから私はおそらくそれを忘れ、そのような混乱を生み出さない別の方法でやります。 お返事ありがとうございます! – Lauriane

関連する問題