Платформа ASP.NET MVC не очень удобна для моделирования (или, скорее, требует слишком большой настройки для правильного моделирования и вызывает слишком много трений при тестировании, IMHO) из-за использования абстрактных базовых классов вместо интерфейсов. Нам повезло с написанием абстракций для хранилища на основе запросов и сеансов. Мы сохраняем эти абстракции очень легкими, и тогда наши контроллеры зависят от этих абстракций для хранения по запросу или по сеансу.
Например, вот как мы справляемся с аутентификацией форм. У нас есть ISecurityContext:
public interface ISecurityContext
{
bool IsAuthenticated { get; }
IIdentity CurrentIdentity { get; }
IPrincipal CurrentUser { get; set; }
}
С конкретной реализацией, такой как:
public class SecurityContext : ISecurityContext
{
private readonly HttpContext _context;
public SecurityContext()
{
_context = HttpContext.Current;
}
public bool IsAuthenticated
{
get { return _context.Request.IsAuthenticated; }
}
public IIdentity CurrentIdentity
{
get { return _context.User.Identity; }
}
public IPrincipal CurrentUser
{
get { return _context.User; }
set { _context.User = value; }
}
}