首页 > 解决方案 > 作用域依赖作为瞬态注入到 MassTransit Consumer

问题描述

我正在使用 Azure Functions v3、MassTransit 和 Azure 服务总线。一旦 Azure Function 从服务总线读取消息,MyConsumer就会调用它。我注意到我的作用域依赖项Foo没有正确注入到 Azure Function 和Myconsumer- 而不是同一个实例被注入到 Azure Function 和MyConsumer中,它们每个都得到一个单独的实例。Azure Function 有没有办法MyConsumer同时注入相同的作用域依赖项?我错过了什么吗?

Azure 函数启动.cs

public override void Configure(IFunctionsHostBuilder builder)
{   
    builder.Services.AddScoped<Foo>();
    builder.Services.AddMassTransitForAzureFunctions(cfg =>
    {
        cfg.AddConsumersFromNamespaceContaining<MyConsumer>();
    });
}

我想作为作用域依赖注入的类。

public class Foo
{
    // Just a way for me to test which instance is injected.  
    public int MyProperty { get; set; } = new Random().Next();
}

功能

class MyAzureFunction
{
    private readonly Foo foo;
    private readonly IMessageReceiver receiver;
    
    public MyAzureFunction(IMessageReceiver receiver, Foo foo)
    {
        this.foo = foo;
    }

    [FunctionName("MyAzureFunction")]
    public async Task Run(
        [ServiceBusTrigger("topic-name", "subscription-name", Connection = "AzureWebJobsServiceBus")] Message message)
    {
        await receiver.HandleConsumer<MyConsumer>("topic-name", "subscription-name", message, default(CancellationToken));
        // foo.MyProperty is 3456411
    }
}

消费者

public class MyConsumer : IConsumer<IMyEvent>
{
    private readonly Foo foo;

    public MyConsumer(Foo foo)
    {
        this.foo = foo;
    }

    public async Task Consume(ConsumeContext<IMyEvent> context)
    {
        // foo.MyProperty is 78961248, indicating a different instance has been injected.
    }
}

标签: c#dependency-injectionazure-functionsmasstransit

解决方案


推荐阅读