.net 简单注入器多次创建控制器并创建不必要的控制器

lx0bsm1f  于 2023-04-22  发布在  .NET
关注(0)|答案(1)|浏览(124)

我注意到在ASP.NET Web API中使用Simple Injector时出现了一个奇怪的行为,因此我将其简化为基本操作。重现步骤:

  • 创建ASP.NET Core的默认Web API项目。我使用的是.NET Core 3.1,现在已经不支持了,但我不认为这与这个问题有任何关系。你将有一个单一的控制器:WeatherForecastController
  • 创建另一个从ControllerBase降下来的API控制器,使用默认的ctor。我在其中使用了默认的Index()方法,但将返回值更改为string
  • 在两个控制器的ctor中放置断点
  • 运行应用程序,并调用weather/get端点:断点显示天气控制器被创建了一次,正如预期的那样。另一个控制器的代码没有被修改,也正如预期的那样。
  • 将这些SimpleInjector nuget包添加到项目中:
  • SimpleInjector:我直接添加它,因为这是文档的建议
  • SimpleInjector.Integration.AspNetCore.Mvc.Core
  • Startup.cs中初始化SI,如下所示
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();

    services.AddSimpleInjector(container, options =>
    {
        options
            .AddAspNetCore()
            .AddControllerActivation();
    });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.ApplicationServices.UseSimpleInjector(container);

    // the rest of the default code
}

// instantiated in ctor in my code but I do it here for brevity
private readonly Container container = new Container();
  • 运行应用程序,并调用weather/get端点:断点显示第二个控制器创建一次,天气控制器创建两次。然后调用weather/get端点。

问题是上面的意外控制器创建。同样的事情发生在我的实际项目中,就像在这个复制测试项目中一样。不必要的控制器创建让我担心。为什么会这样,如何避免?这肯定不正常,但我无法想象在这个简单的配置中我会犯什么错误。

**EDIT:**此奇怪行为仅在第一次weather/get调用时出现

liwlm1x9

liwlm1x91#

Simple Injector包含一个自动验证功能,当解析第一个组件时,该功能将触发验证并构造Simple Injector已知的所有类型作为验证措施。这意味着在第一次调用时,控制器将被创建一次。每个后续请求,控制器将仅被创建一次。
当另一个控制器只被创建一次时,这可能意味着它不是由简单注入器创建的。你可以通过在构造函数中放置一个断点并检查堆栈跟踪来检查这一点。为什么会这样,从你发布的代码中我不清楚。
关于验证和自动验证的更多信息可以在这里找到。

相关问题