Ogólnie rzecz biorąc, w aplikacji internetowej chcesz, aby stan był jak największym zakresem żądania.
Tylko w przypadku optymalizacji bardzo niskiego poziomu istnieje prawdopodobieństwo, że natkniesz się na przypadek, w którym właściwe jest tworzenie pojedynczych obiektów (a nawet wtedy jest szansa, że przeciągniesz taką logikę buforowania / udostępniania do innej klasy, która zostanie wciągnięta jako zależność od innych obiektów [zakres żądania] i to zakres singletona). Pamiętaj, że singleton w kontekście aplikacji internetowej oznacza wiele wątków korzystających z tych samych obiektów. Rzadko jest to dobra wiadomość.
Na tej samej podstawie zakres przejściowy jest najprostszym domyślnym zakresem (i właśnie dlatego Ninject 2 tak robi) - zakres żądań powinien brać udział w równaniu tylko wtedy, gdy coś musi zostać udostępnione ze względu na wydajność itp. (lub ponieważ jest to po prostu kontekst udostępniania [jak wspomniano w drugiej odpowiedzi]).