Tôi chỉ gặp vấn đề tương tự, nhưng giải pháp của tôi hơi khác.
Interface:
public interface IHttpContextProvider
{
/// <summary>
/// Gets the current HTTP context.
/// </summary>
/// <value>The current HTTP context.</value>
HttpContextBase Current { get; }
}
Thực hiện:
/// <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); }
}
}
sau đó tôi đăng ký IHttpContextProvider
như một singleton trong container. Tôi vẫn là một chút của một newbie khi nói đến DI, vì vậy có lẽ tôi là hơn những điều phức tạp, nhưng từ những gì tôi có thể hiểu, tôi không thể có bất kỳ thành phần singleton phụ thuộc vào các thành phần lối sống PerWebRequest, có ý nghĩa (nhưng đó là những gì tất cả các ví dụ làm). Trong giải pháp của tôi, tôi phụ thuộc vào HttpContext.Current
trong một thành phần bị cô lập và tôi không quan tâm đến việc kiểm tra điều đó. Nhưng mọi thành phần cần truy cập vào ngữ cảnh HTTP có thể nhận được điều đó bằng cách tùy thuộc vào IHttpContextProvider
và dễ dàng giả thiết khi cần.
Tôi có thực sự quá phức tạp hoặc có bất kỳ cảnh báo nào trong giải pháp của mình không?
Đánh dấu, cảm ơn thông tin - Tôi không biết về PerWebRequest. Tôi sẽ kiểm tra. –
Đánh dấu, tôi đã xem xét PerWebRequest, nhưng tôi vẫn không thấy các dịch vụ có thể lấy HttpContext như thế nào. Khi tôi cố gắng để đăng ký một thể hiện của HttpContextBase nó trong container bản thân mình, nó không thành công sau khi yêu cầu thứ hai (kể từ khi một cá thể đã được đăng ký trong yêu cầu trước đó). Tôi không thể tìm thấy bất cứ điều gì trên Google cho đến nay ... –
Tôi có thể đã hiểu lầm những gì bạn đang cố gắng làm, nhưng bạn không thể sử dụng HttpContext từ Application_Start vì tại thời điểm này có * là * không HttpContext (PerWebRequest hoặc không PerWebRequest). Bây giờ tôi nghĩ về nó, nó không có ý nghĩa để cố gắng kiểm soát tuổi thọ của HttpContext từ DI Container, vì cuộc đời này đã được quản lý bởi framework ASP.NET MVC.Những gì bạn có thể làm là móc vào một IControllerFactory tùy chỉnh và lấy HttpContext được phục vụ cho bạn tại thời điểm đó, và sau đó sử dụng một phương thức factory để kết nối mọi thứ khác phụ thuộc vào nó. –