在ASP.Core中,"将IStartup直接注入依赖注入容器而不是调用UseStartup或Configure"是什么意思?

时间:2018-01-07 17:21:56

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

ms docs Hosting in ASP.NET Core最后一节中说明:

  

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

     

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<>注入语法添加正常启动和注入启动的更多信息。我看到的唯一区别是注入由Ihostingstartup实现调用,但是&#34;必要&#34; UseSetting()中没有一个被调用。上面大胆的句子是什么意思?

1 个答案:

答案 0 :(得分: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)状态。

如果我遗漏了任何内容,你可以在评论中提出任何问题。