私はGuiceに関連し、Guice以外のシングルトンを避けるというわずかなジレンマがあります。マルチモジュールプロジェクトでは、shared
、frontend
、backend
の3つのモジュールがあるとします。 frontend
とbackend
の両方は、shared
モジュールの内部でProfiling
クラスのインスタンスを使用します(これはメソッドを実行し、プロジェクト全体で広く使用されます)。マルチモジュール環境での依存性注入(Guice経由)の使用
ほとんどすべてのクラスでこのProfiling
インスタンス(ユーザーが接続すると、オブジェクトは動的に作成されます)を使用する必要があります。
すべての単一のクラスがProfiling
クラスのインスタンスを必要とする場合、それを行うためのさまざまな方法には欠点があります(インスタンスフィールドにコピーコンストラクタでは、)
解決方法1:
private final Profiling profiling;
@Inject
public User(Profiling profiling, String username)
欠点:すべて012コンバーターのにProfiling
オブジェクトを含める必要があります。これは面倒で、やや意味がありません。また、GuiceのInjector
を静的に(または注入して)保存して、プログラムが最初にロードされたときだけでなく、オンザフライでUser
オブジェクトを作成できるようにする必要があります。 (唯一のインスタンスフィールドなど)
解決方法2:
@Inject
private Profiling profiling;
public User(String username)
欠点:上記と同様に、あなたはすべての単一のオブジェクトをインスタンス化するために、GuiceののInjector
を使用する必要があります。つまり、User
のオブジェクトを動的に作成するには、User
オブジェクトを作成するクラスにインジェクタのインスタンスが必要です。
public static final Profiling PROFILING; // Can also use a get method
public Application() {
Application.PROFILING = injector.getInstance(Profiling.class)
}
欠点(米国によって手動で作成した(メイン)クラスの静的フィールドのような)解決策3:Guiceの者/依存性注入の推奨に反する - 静的にアクセスされるシングルトンProfiling
オブジェクトを作成(によってApplication.PROFILING.start()
)Guiceの目的を破る? (Guiceので注入されたすべての単一のクラスの静的フィールド、など)
ソリューション4
@Inject
private static Profiling profiling;
// You need to request every single class:
// requestStaticInjection(XXXX.class)
欠点:それは静的に注入されているのでここでも、これはGuiceのの/依存性注入の推奨事項に反します。 GuiceがProfilerを注入する必要があるすべてのクラスをリクエストする必要もあります(面倒です)。
私のプロジェクトを設計し、私が使用していたシングルトンのデザインパターンに落ちないようにする良い方法はありますか?
TL; DR:シングルトンデザインパターンに落ちることなく、すべての単一のクラスでこのプロファイリングインスタンス(モジュールごとに1つ)にアクセスできるようにしたい。
ありがとうございます!
あなたが提案した(静的ではない)任意のguice管理クラスに注入します。コンストラクタインジェクションのみを使用します(手動コンストラクションは同じ引数を渡さなければならず、無効なインスタンスを作成することはできません)。しかし、ユーザはguice管理クラスのようには聞こえません。私は(おそらく、そこに十分な情報がありません)、プロファイリングクラスをインジェクトできるユーザーファクトリを実装し、各ユーザーにプロファイリングインスタンスを持つという問題を抽象化して実装します。 – pandaadb