私のプロジェクトでは、オブジェクト (主にシングルトン) の大きなグラフに依存関係 (サービス クラス) を提供する IOC コンテナーとしてGuiceを使用しています。構築中に依存関係が失敗し、この依存関係が多くのオブジェクトで必要とされる場合、失敗が何度も発生し、 Guice に例外が追加されますProvisionException
。
問題の修正を少しでも節約するために発生したすべてのエラーのリストが表示されるため、この動作の合理性を理解できます。ただし、この場合の繰り返しの失敗はリソースを大量に消費するため、この機能と「フェイル ファスト」を無効にしたいと考えています。さらに、「ProvisionException」には同じ例外のリストが含まれています。
この振る舞いは、実装における悪い習慣 (つまり、リソースを集中的に使用するオブジェクトの作成) の徴候 (におい) であることを理解していますが、依存関係は抽象化されており、依存関係の注入を使用して誰でも実装とプラグインを提供できるため、それに対する防御はほとんどありません。
私が知りたいのは: -
最初の例外で Guice がインジェクターの作成を終了できるようにするパラメーターはありますか?
どんな助けでも大歓迎です。
編集:
@Test
public void guiceExample()
{
Injector injector = Guice.createInjector(new TestModule());
try{
IAmANeedyObject instance = injector.getInstance(IAmANeedyObject.class);
}
catch (ProvisionException e)
{
assertThat(e.getErrorMessages().size(),Is.is(2));
}
}
このテスト アセットには 2 つの例外がスローされました
import com.google.inject.AbstractModule;
import com.google.inject.Inject;
public class TestModule extends AbstractModule {
@Override
protected void configure() {
bind(IWasDesignedWithHonestIntent.class).to(NastyThrowingExample.class);
bind(IMindMyOwnBusiness.class).to(SomeLucklessObject.class);
bind(IAlsoMindMyOwnBusiness.class).to(SomeEquallyLucklessObject.class);
bind(IAmANeedyObject.class).to(LowSelfEsteem.class);
}
}
interface IWasDesignedWithHonestIntent {}
interface IMindMyOwnBusiness {}
interface IAlsoMindMyOwnBusiness {}
interface IAmANeedyObject {}
@Singleton
class NastyThrowingExample implements IWasDesignedWithHonestIntent {
@Inject
public NastyThrowingExample() throws LongSlowAgonisingDeathException {
throw new LongSlowAgonisingDeathException("I am dying");
}
}
class LongSlowAgonisingDeathException extends Exception {
@Inject
public LongSlowAgonisingDeathException(String message) {
super(message);
}
}
class SomeLucklessObject implements IMindMyOwnBusiness {
@Inject
public SomeLucklessObject(IWasDesignedWithHonestIntent designedWithHonestIntent) {
}
}
class SomeEquallyLucklessObject implements IAlsoMindMyOwnBusiness {
@Inject
public SomeEquallyLucklessObject(IWasDesignedWithHonestIntent designedWithHonestIntent) {
}
}
class LowSelfEsteem implements IAmANeedyObject {
@Inject
public LowSelfEsteem(IMindMyOwnBusiness iMindMyOwnBusiness, IAlsoMindMyOwnBusiness alsoMindMyOwnBusiness) {
}
}