simpleinjector的WebAPIRequest生命周期是否包含消息处理程序?

本文关键字:包含 消息处理 程序 是否 周期 WebAPIRequest 生命 simpleinjector | 更新日期: 2023-09-27 17:49:34

我是SimpleInjector的新手,并通过使用它与WebAPI的示例进行工作。我使用了SimpleInjector.Integration.WebApi.WebHost.QuickStart nu-get包,然后为我的测试注册了一个简单的类型,如下所示:

container.RegisterWebApiRequest<SimplePOCO>();

在ApiController方法中,我可以请求一个实例。到目前为止,一切顺利。我想将我的测试扩展到管道的早期,特别是消息处理程序。所以我创建了一个简单的DelegatingHandler:

protected override Task<HttpResponseMessage> SendAsync(
                                           HttpRequestMessage request,
                                           CancellationToken cancellationToken) {
    Task<HttpResponseMessage> response;
    var container =  SimpleInjectorWebApiInitializer.container;
    var rc = container.GetInstance<SimplePOCO>();
    response = base.SendAsync(request, cancellationToken);
    response.ContinueWith((responseMsg) =>  {   });
    return response;
}

调用GetInstance<SimplePOCO>()出错,提示以下消息:

SimplePOCO类型的注册委托抛出了异常。的SimplePOCO注册为"Web API Request"方式,但是实例在Web API请求的上下文之外被请求。

我做错了什么吗?消息处理程序是否在WebAPI请求的生命周期之外?这看起来很奇怪,考虑到它们是多么完整。如果消息处理程序在生命周期之外,是否存在包含消息处理程序的更长的生命周期?

simpleinjector的WebAPIRequest生命周期是否包含消息处理程序?

消息处理程序是否在WebAPI请求的生命周期之外?

好吧,事实上,他们是。除非您显式地触发IDependencyScope的创建,否则IDependencyScope将在DefaultHttpControllerActivator.Create方法中创建(通过调用request.GetDependencyScope())。

要确保你的代码在依赖范围内运行,你所要做的就是在你的处理程序中显式调用request.GetDependencyScope():

protected override Task<HttpResponseMessage> SendAsync(
    HttpRequestMessage request, CancellationToken cancellationToken) {
    // trigger the creation of the scope.
    request.GetDependencyScope();
    Task<HttpResponseMessage> response;
    var container =  SimpleInjectorWebApiInitializer.container;
    var rc = container.GetInstance<SimplePOCO>();
    response = base.SendAsync(request, cancellationToken);
    response.ContinueWith((responseMsg) =>  {   });
    return response;
}