Strictly speaking, you should be using an IO-like Monad to do your database code. But that's OK because you can use ReaderT[IO, Config]
Typically I would define something like (if I understand you correctly):
case class Config(controllers: Controllers, services: Services, repos: Repositories)
Then run your program thru Reader[Config, _]. If you do use ReaderT with IO, then it's useful to do something like this:
type Program[+A] = ReaderT[IO, Config, A]
You can then define type constructors in a module:
object Program {
def point[A](a: => A) = ....
}
Chris