0

どのコンポーネントでもインジェクターを暗黙的に使用できるように、ルート パッケージ オブジェクトに暗黙的な scaldi Module があります。

このモジュールは次のようになります。

val additionalModule = new AtomicReference[Module](new Module {})

lazy val applicationModule = additionalModule.get ++ new Module {
  bind[Trait1] to new Impl1
  bind[Trait2] to new Impl2
} 

Scaldi のドキュメントには、既に初期化されているモジュールにバインドすることは推奨されていないと書かれているため、テスト/モジュールの再利用のために additionalModule を追加し、事前定義されたモジュールに集約しました。私はそれを正しく理解しましたか?

4

1 に答える 1

0

インジェクターをグローバルにアクセス可能にすることはお勧めしません。特定のクラスで使用したい場合はInjector、このクラスに暗黙的なパラメーターを導入することをお勧めします。このようなもの:

class UserService(implicit inj: Injector) extends Injectable {
  // ...
}

(詳細)

injectedまたは、マクロと組み合わせてコンストラクター注入を使用できます。

class TokenRepo(db: Database, metrics: Metrics) extends Tokens {
  // ...
}

これで、次のようにバインドできます。

class MyModule extends Module {
  bind [Tokens] to injected [TokenRepo]
}

(詳細)

テスト中、モジュールのインスタンスをテスト内でさまざまな方法で構成している場合は、モジュールのインスタンスを再利用しないことが重要です。これは、テスト モジュールだけでなく、アプリケーション モジュールもインスタンス化する必要があることを意味します。例えば:

implicit injector = new TestModuleWithMocks ++ new Appmodule

@Mironor が述べたように、構成内のモジュールの順序に注意する必要があります。

于 2016-02-23T15:14:53.983 に答える