Singleton следует использовать только в том случае, если вы хотите убедиться, что в экземпляре вашего приложения когда-либо создается только один экземпляр класса.
Синглтон едва ли можно считать запахом кода. Большинство людей, которые используют синглтон, используют его плохо. Поэтому, когда вы видите один, велика вероятность того, что он не используется должным образом.
Что касается DAL, объекты не подлежат расширению. Они должны полагаться на использование пула соединений и затем запрашивать соединение из пула каждый раз, когда нужно выполнить команду.
Конечно, существуют разные шаблоны, и вы должны в основном использовать ORM, если запрос не нуждается в настройке для повышения производительности.
См. NHibernate , SubSonic , Linq2Sql , Entity Framework (еще не выпущен?) И т. Д.