.net 简单注入器:如何注入HttpContext?
我已经开始使用Simple Injector作为我的DI容器(主要是出于性能原因:如果有人有建议,请告诉我),但我编写的一些类使用HttpContextBase作为构造函数参数。 现在我已经决定将其从构造函数中删除并创建一个属性,如下所示:.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
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 { }