【问题标题】:In ASP.Core, what does "injecting IStartup directly into the dependency injection container rather than calling UseStartup or Configure" mean?在 ASP.Core 中,“将 IStartup 直接注入依赖注入容器而不是调用 UseStartup 或 Configure”是什么意思?
【发布时间】:2018-01-07 17:21:55
【问题描述】:

ms docs Hosting in ASP.NET Core的最后一节中指出:

如果主机是通过直接注入IStartup构建的 依赖注入容器 而不是调用UseStartupConfigure,可能会出现如下错误:

Unhandled Exception: System.ArgumentException: A valid non-empty application name must be provided.

这是因为applicationName(ApplicationKey)(当前 程序集)需要扫描HostingStartupAttributes。如果应用程序 手动将IStartup注入到依赖注入容器中,添加 使用指定的程序集名称对WebHostBuilder 进行以下调用:

WebHost.CreateDefaultBuilder(args)
    .UseSetting("applicationName", "<Assembly Name>")
    ...

我不明白上面第一行粗体是什么意思。您如何将IStartup 直接注入依赖注入容器?这是否意味着将启动实例传递给某处的构造函数(不太可能)?文档指向an example 以获取更多信息,其中使用UseStartup&lt;&gt; 注入语法添加正常启动和注入启动。我看到的唯一区别是注入是由Ihostingstartup 实现调用的,但两者中的任何一个都没有调用“必要的”UseSetting()。上面粗体字是什么意思?

【问题讨论】:

    标签: asp.net .net dependency-injection asp.net-core


    【解决方案1】:

    如何将 IStartup 直接注入依赖项 注射容器?

    你可以这样做

    IWebHostBuilder webbuilder = new WebHostBuilder().ConfigureServices(services =>
    {
        services.AddSingleton<IStartup>(mockStartup);
    
    }).UseSetting(WebHostDefaults.ApplicationKey, "<ApplicationAssemblyName>");
    

    这是否意味着将启动实例传递给某处的构造函数 (不太可能)?

    这意味着注册您自己的Startup 类实例。

    如果您正在研究模拟 Startup 类并使用您自己的(模拟的)实例作为控制器的依赖项,控制器将在您的集成单元测试运行时使用您模拟的依赖项,那么您更有可能通过将Startup 类直接注入到注入容器中来构建主机。

    假设您必须测试您的控制器是否返回适当的 HTTP 状态代码,同时它还使用 Asp.net 核心过滤器验证输入参数,您想在单元测试方法中编写如下内容:

    HttpResponseMessage response = await httpclient.PostAsync($"/api/{controllerName}", jsonContent);
    

    那么在你可以做的断言区域...

    Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.Created));
    

    控制器动作如下所示:

    [HttpPost]
    [ValidateJobDetailsRequest]
    public async Task<IActionResult> AddNewJobRequest([FromBody] AddNewRequest addNewlRequest)
    {
        Entity detailEntity = this._mapper.Map<AddNewRequest , Entity>(addNewlRequest);
    
        await this._manager.AddRequest(detailEntity);
        this._logger.LogInformation($"The detail = {jobDetailRequest} has successfully been dispatched.");
        return Created(string.Empty, addNewlRequest);
    }
    

    如果您要直接测试此方法,那么您不会测试 ValidateJobDetailsRequest,它会检查模型是否有效,如果模型无效则返回错误请求 (HTTP 400) 状态。

    如果我遗漏了什么,您可以在 cmets 中提出任何问题。

    【讨论】:

      猜你喜欢
      • 2016-12-06
      • 2021-02-24
      • 2018-09-13
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 2011-06-08
      相关资源
      最近更新 更多