DI を使用して大きなアプリケーションを作成しました。アプリケーションは、ほとんどの依存関係が注入される初期化時にブートストラップによって構成されます。すべて良好。
ただし、単純にすべての場所に挿入できないサービス*もあります。1 つの良い例は、ログ サービスです。これはログであるため、ソリューション内のすべてのクラスで、デバッグまたはトレースの目的で使用することができます。すべてのクラスが初期化時に作成されるわけではなく、一部はサード パーティによって提供されます (アプリケーションはフレームワークのようなものです)。今のところ、私の解決策はシングルトンを使用することです。シングルトン用のラッパー クラスもいくつか作成したので、可能な場合はそれを挿入できます。
それらの場所で ServiceLocator を使用する方が良いのではないかと思っていました。これにより、シングルトンが引き起こすハードカップリングが完全に削除されます。はい、クラスはロケーターに結合されますが、それらに任意の実装を提供できます。
* DDD 用語で。
PS: ここでは .NET を使用していますが、そのようにタグ付けしません。この質問は、DI を受け入れるすべての言語に当てはまると思います。