一般的なグローバル状態では、それがグローバル クラスであろうとシングルトンであろうと、可能な限り避ける必要があります。
理想的な解決策は、アプリケーションが構成から接続文字列をロードし、それを必要とするクラスに注入することです。アプリケーションのサイズによっては、UnityやCastle WindsorなどのIoCコンテナーが役立ちますが、ソリューションの必須部分ではないことは確かです。
それがオプションではなく、(既存のコードベースなどの理由で) グローバルな状態を維持することに行き詰まっている場合、提案した 2 つのアプローチに大きな違いがあることを私は知りません。
更新:明確にするために、今のところ IoC コンテナーに関するすべてのことを忘れてください。「注入」は、「パラメーターとして渡す」(クラスのコンストラクター、またはプロパティを介して、またはその他) と言う手の込んだ方法です。
データ アクセス クラスが (ある種のグローバルまたはシングルトンから) 接続文字列を要求するのではなく、コンストラクタまたはプロパティを介して渡されます。
更新 #2:このアプローチが何を伴うのかについて、まだ誤解があると思います。
基本的には、データ アクセス クラスが次のように見えるかどうかにかかっています。
public class DataAccessClass
{
public DataAccessClass()
{
_connString = SomeStaticThing.GetConnectionString();
}
}
また
public class DataAccessClass
{
public DataAccessClass(string connString)
{
_connString = connString;
}
}
これらの 記事(実際、そのブログの記事の多く) では、なぜ後者が前者よりも優れているかについて、多くの理由が詳しく説明されています (特に、前者は単体テストがほとんど不可能だからです)。
はい、どこかで、最初に接続文字列を取得する責任を負う静的担当者が必要になりますが、要点は、静的メソッドへの依存関係がその 1 つの場所に限定されていることです (これはおそらくあなたのコードベース全体に散りばめられるのではなく、アプリケーションをブートストラップするプロセスのメイン メソッド)。