Я только что столкнулся с этой же проблемой, но мое решение несколько иное.
Интерфейс:
public interface IHttpContextProvider
{
/// <summary>
/// Gets the current HTTP context.
/// </summary>
/// <value>The current HTTP context.</value>
HttpContextBase Current { get; }
}
Реализация:
/// <summary>
/// A default HTTP context provider, returning a <see cref="HttpContextWrapper"/> from <see cref="HttpContext.Current"/>.
/// </summary>
public class DefaultHttpContextProvider : IHttpContextProvider
{
public HttpContextBase Current
{
get { return new HttpContextWrapper(HttpContext.Current); }
}
}
Затем я регистрирую IHttpContextProvider
в качестве синглтона в контейнере.
Я все еще немного новичок, когда дело доходит до DI, поэтому, возможно, я слишком усложняю вещи, но из того, что я могу понять, я не могу иметь одноэлементные компоненты, зависящие от компонентов образа жизни PerWebRequest, что имеет смысл это то, что делают все примеры). В моем решении я зависим от HttpContext.Current
в изолированном компоненте, и я не заинтересован в его тестировании. Но каждый компонент, которому нужен доступ к контексту HTTP, может получить это в зависимости от IHttpContextProvider
и легко смоделировать его при необходимости.
Я действительно слишком усложняю вещи или есть какие-то предостережения в моем решении?