我在一个ASP.NETWebApi项目中注册了以下基本SI。
启动. cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSimpleInjector(container, options =>
{
options
.AddAspNetCore()
.AddControllerActivation();
});
services.AddHttpContextAccessor();
services.AddScoped<Work>(services =>
{
var traceId = services.GetRequiredService<IHttpContextAccessor>().HttpContext.TraceIdentifier;
// ...
});
}
public void Configure(IApplicationBuilder app)
{
app.ApplicationServices.UseSimpleInjector(container);
// ...
container.Verify();
}
private readonly Container container = new Container();
问题
Container.Verify()
尝试解析Work
示例,该示例的工厂委托成功解析IHttpContextAccessor
,但其HttpContext
为null
,因为启动时没有当前HTTP调用。因此,代码因空引用异常而终止。
我不认为除了防范null
我们还能做什么,但这与我在此上下文中的品味不符:
- 当我知道这个工厂委托只应该在HTTP调用期间被调用时,我为什么还要这样做呢?
- 如果我的HTTP作用域依赖项是
null
,我该怎么办?当然,返回一个假的,但是我如何检测它是null
,这是有充分理由的,而不是因为我的Web基础设施正在以某种方式死亡?
我看不出有什么好的解决办法。这种情况下你怎么办?
1条答案
按热度按时间yjghlzjz1#
我在过去写过很多关于这个问题的文章,你的
HttpContext
和它的TraceIdentifier
是运行时数据,运行时数据应该被排除在对象图的构造之外,例如this article。在您的特定情况下,正确的解决方案是什么很难说,因为这取决于您试图构造的内容的细节,但本文提供了一些指针。