.net SimpleInjector容器.Verify()具有HTTP上下文范围内的依赖项

wkyowqbh  于 2023-01-27  发布在  .NET
关注(0)|答案(1)|浏览(92)

我在一个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,但其HttpContextnull,因为启动时没有当前HTTP调用。因此,代码因空引用异常而终止。
我不认为除了防范null我们还能做什么,但这与我在此上下文中的品味不符:

  • 当我知道这个工厂委托只应该在HTTP调用期间被调用时,我为什么还要这样做呢?
  • 如果我的HTTP作用域依赖项是null,我该怎么办?当然,返回一个假的,但是我如何检测它是null,这是有充分理由的,而不是因为我的Web基础设施正在以某种方式死亡?

我看不出有什么好的解决办法。这种情况下你怎么办?

yjghlzjz

yjghlzjz1#

我在过去写过很多关于这个问题的文章,你的HttpContext和它的TraceIdentifier是运行时数据,运行时数据应该被排除在对象图的构造之外,例如this article
在您的特定情况下,正确的解决方案是什么很难说,因为这取决于您试图构造的内容的细节,但本文提供了一些指针。

相关问题