Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NServicebus共享具有WebAPI依赖范围的嵌套容器_C#_Asp.net Web Api_Dependency Injection_Nservicebus_Structuremap - Fatal编程技术网

C# NServicebus共享具有WebAPI依赖范围的嵌套容器

C# NServicebus共享具有WebAPI依赖范围的嵌套容器,c#,asp.net-web-api,dependency-injection,nservicebus,structuremap,C#,Asp.net Web Api,Dependency Injection,Nservicebus,Structuremap,是否可以共享/使用WebAPI依赖项解析器创建的嵌套容器 structuremap.web(我使用structuremap和NServiceBus.structuremap以及usecainer(x=>x.ExistingContainer(container)))包提供了idependencysolver,idependencycoscope非常自解释的实现-解析器是使用根容器创建的,当请求范围时,它返回一个新范围,该范围是使用根中的嵌套容器创建的 我想知道的是,在WebAPI端点的上下文中,

是否可以共享/使用WebAPI依赖项解析器创建的嵌套容器

structuremap.web(我使用structuremap和NServiceBus.structuremap以及
usecainer(x=>x.ExistingContainer(container))
)包提供了
idependencysolver
idependencycoscope
非常自解释的实现-解析器是使用根容器创建的,当请求范围时,它返回一个新范围,该范围是使用根中的嵌套容器创建的

我想知道的是,在WebAPI端点的上下文中,我可以与NSB共享该嵌套容器吗,结构映射生成器的作用与WebAPI解析器的作用非常相似-container.GetNestedContainer()。这意味着对于使用总线的每个(HTTP)请求,我都会得到两个嵌套容器


我的使用案例是,我想创建一种headers bucket,我可以将头从
DelegatingHandler
中放入,然后在
OutgoingMessageMutator

中将其取出。这个问题也已发布在google group上。我快速总结了阅读此问题的人的讨论:

  • NServiceBus仅在接收消息时创建嵌套容器。通过使用ASP.NET管道中的
    IBus.Send
    或类似方法,NServiceBus使用最初配置的容器(例如用于解析消息变体)
  • 将来自传入请求的消息直接放置在队列上。这也支持自定义扩展(例如添加标题)
  • 您可以使用DI技巧(例如通过使用委托)解析来自不同(嵌套)容器的依赖关系,但这涉及到一些复杂性。虽然线程静态可能用于DI欺骗,但请注意,引入异步API的
    NServiceBus
    版本6将打破这一点
  • IBus
    可以包装在助手中,该助手可以使用管道当前容器解析并附加标题

@Sabacc总结了NServiceBus google group中讨论的可用选项。我们认为
IBus
包装器方法最适合我们的需要。下面是一个示例实现,以供参考

首先是一个用于添加到头bucket的委托处理程序,本例添加授权令牌。如果设置了标头,则会从当前依赖范围解析一个
HeaderBucket
实例,该依赖范围可通过
HttpRequestMessage.GetDependencyScope()
访问

现在只需将控制器依赖项声明为
IHeaderAwareBus
,ASP.Net管道将从从
DelegatingHandler

public class AuthorizationTokenCapturingHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        AuthenticationHeaderValue header = request.Headers.Authorization;
        if (header != null)
        {
            HeaderBucket bucket = (HeaderBucket)request.GetDependencyScope().GetService(typeof(HeaderBucket));
            bucket.Add(new HeaderBucket.Header(HeaderConstants.AUTHORIZATION_TOKEN, header.Parameter));
        }

        return base.SendAsync(request, cancellationToken);
    }
}
public class HeaderAwareBus : IHeaderAwareBus
{
    private IBus _bus;
    private HeaderBucket _bucket;

    public HeaderAwareBus(IBus bus, HeaderBucket bucket)
    {
        _bus = bus;
        _bucket = bucket;
    }

    public ICallback Send(object message)
    {
        foreach (HeaderBucket.Header header in _bucket)
        {
            _bus.SetMessageHeader(message, header.Key, header.Value);
        }
        return _bus.Send(message);
    }
}