In generale, in un'app Web, vuoi che lo stato sia l'ambito della richiesta il più possibile.
Solo nel caso di ottimizzazioni di livello molto basso è probabile che ti imbatti in un caso in cui è appropriato creare oggetti singleton (e anche allora è probabile che tu estragga tale logica di memorizzazione nella cache / condivisione in un'altra classe che viene trascinata dentro come dipendenza dagli altri tuoi oggetti [ambito della richiesta] e fallo quello ambito singleton). Ricorda che un singleton nel contesto di un'app Web significa più thread che utilizzano gli stessi oggetti. Questa è raramente una buona notizia.
Sulla stessa base, l'ambito transitorio è l'impostazione predefinita più semplice (ed è per questo che Ninject 2 lo rende così):l'ambito della richiesta dovrebbe entrare nell'equazione solo quando qualcosa deve essere condiviso per motivi di prestazioni, ecc. (o perché è semplicemente il contesto della condivisione [come menzionato nell'altra risposta]).