加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – SimpleInjector的WebAPIRequest生命周期是否包含消息处理

发布时间:2020-12-16 02:00:31 所属栏目:百科 来源:网络整理
导读:我是SimpleInjector的新手,并通过WebAPI使用它的示例.我使用了SimpleInjector.Integration.WebApi.WebHost.QuickStart nu-get包,然后为我的测试注册了一个简单类型,如下所示: container.RegisterWebApiRequestSimplePOCO(); 从ApiController方法内部,我可以
我是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>()错误:

The registered delegate for type SimplePOCO threw an exception. The
SimplePOCO is registered as ‘Web API Request’ lifestyle,but the
instance is requested outside the context of a Web API Request.

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

解决方法

Are Message Handlers outside the lifetime of a WebAPI request?

嗯,事实上,他们是.除非您显式触发IDependencyScope的创建,否则将在DefaultHttpControllerActivator.Create方法内创建IDependencyScope(通过调用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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读