.net 简单注入器:如何注入HttpContext?

.net 简单注入器:如何注入HttpContext?,.net,dependency-injection,httpcontext,simple-injector,.net,Dependency Injection,Httpcontext,Simple Injector,我已经开始使用Simple Injector作为我的DI容器(主要是出于性能原因:如果有人有建议,请告诉我),但我编写的一些类使用HttpContextBase作为构造函数参数。 现在我已经决定将其从构造函数中删除并创建一个属性,如下所示: public HttpContextBase HttpContext { get { if (null == _httpContext) _httpCon

我已经开始使用Simple Injector作为我的DI容器(主要是出于性能原因:如果有人有建议,请告诉我),但我编写的一些类使用HttpContextBase作为构造函数参数。 现在我已经决定将其从构造函数中删除并创建一个属性,如下所示:

    public HttpContextBase HttpContext
    {
        get
        {
            if (null == _httpContext)
                _httpContext = new HttpContextWrapper(System.Web.HttpContext.Current);
            return _httpContext;
        }
        set
        {
            _httpContext = value;
        }
    }

但我不喜欢这个解决方案。。。有什么建议吗?

你应该总是喜欢构造函数注入而不是其他任何东西。这几乎总是可能的。您可以按如下方式注册您的
HttpContextBase

container.Register<HttpContextBase>(() =>
    new HttpContextWrapper(HttpContext.Current), 
    Lifestyle.Scoped);
FakeHttpContext
是一个空的
HttpContextBase
实现,用于在容器正在验证时防止返回
null
FakeHttpContext
就是这样:

public class FakeHttpContext : HttpContextBase { }

但是请注意,HttpContext是运行时数据和。您不应该将HttpContext或其上的任何抽象注入到您的组件中,而应该创建一个特定于应用程序的抽象,为消费者提供其实际需要的内容(例如用户标识或租户id)。这个抽象的实现可以简单地在内部调用HttpContext.Current,这样就完全不需要注入HttpContext。

您有Api.dll和Domain.dll。在Domain.dll中。有一个存储库,它需要您从http上下文中调用一个令牌来调用某个微服务并将令牌传递给它。您只能从Http上下文获取令牌。创建存储库时,必须在作用域中设置此令牌。特定于应用程序的抽象在这里有什么帮助?
public class FakeHttpContext : HttpContextBase { }