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

EBa*_*arr 3 c# simple-injector asp.net-web-api

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

container.RegisterWebApiRequest<SimplePOCO>();
Run Code Online (Sandbox Code Playgroud)

从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;
}
Run Code Online (Sandbox Code Playgroud)

GetInstance<SimplePOCO>()使用以下消息调用错误:

SimplePOCO类型的已注册委托引发了异常.SimplePOCO注册为"Web API请求"生活方式,但实例是在Web API请求的上下文之外请求的.

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

Ste*_*ven 7

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

嗯,事实上,他们是.除非您触发IDependencyScope显式创建,否则在方法内IDependencyScope创建(通过调用request.GetDependencyScope())DefaultHttpControllerActivator.Create.

要确保代码在依赖范围内运行,您所要做的就是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;
}
Run Code Online (Sandbox Code Playgroud)