用于依赖注入的 Azure 触发的 Webjobs 范围 [英] Azure Triggered Webjobs Scope for Dependency Injection

查看:17
本文介绍了用于依赖注入的 Azure 触发的 Webjobs 范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经阅读并询问了一些关于如何使用 WebJob 尤其是 Triggered Webjobs 使用 DI 的问题.

I've read and asked some questions on how to use DI using WebJob and especially Triggered Webjobs.

我仍然试图弄清楚如何将 DI 优雅地集成到触发式 webjobs 中,@Steven 问了我一个很好的问题:

I still try to figure out how to integrate gracefully DI in triggered webjobs and @Steven asked me a good question :

难道没有办法在某个范围内包装您的服务的执行吗?例如,MVC 和 Web API 对此有一个 IDependencyScope 抽象.这会通知请求的开始和结束.为了能够进行范围界定,您要么需要有这样的拦截点,要么需要能够包装对 JobActivator 的调用.

Isn't there a way to wrap the execution of your service in some scope? For instance, MVC and Web API have an IDependencyScope abstraction for this. This notifies the starting and ending of a request. To be able to do scoping, you either need to have such interception point or you need to be able to wrap the call to JobActivator.

我知道我可以在我的触发函数中启动一个范围,但我想知道 sdk 中是否有任何可扩展性点允许我们进行范围界定?

I know that I can start a scope inside my triggered function but I would like to know if there are any point of extensibility in the sdk that allow us to do scoping ?

谢谢.

推荐答案

我已打开一个请求 向 Azure Webjob 团队添加 IDependencyScope 以处理范围.

我创建了一个小型库来收集围绕 Azure Webjobs 和 SimpleInjector 的类:

I've create a small library to gather classes around Azure Webjobs and SimpleInjector :

对于 QueueTrigger 和 ServiceBustrigger,我遇到过这些解决方案:

For QueueTrigger and ServiceBustrigger, I've come accross these solutions :

public sealed class ScopedMessagingProvider : MessagingProvider
{
    private readonly ServiceBusConfiguration _config;
    private readonly Container _container;

    public ScopedMessagingProvider(ServiceBusConfiguration config, Container container)
        : base(config)
    {
        _config = config;
        _container = container;
    }

    public override MessageProcessor CreateMessageProcessor(string entityPath)
    {
        return new ScopedMessageProcessor(_config.MessageOptions, _container);
    }

    private class ScopedMessageProcessor : MessageProcessor
    {
        private readonly Container _container;

        public ScopedMessageProcessor(OnMessageOptions messageOptions, Container container)
            : base(messageOptions)
        {
            _container = container;
        }

        public override Task<bool> BeginProcessingMessageAsync(BrokeredMessage message, CancellationToken cancellationToken)
        {
            _container.BeginExecutionContextScope();
            return base.BeginProcessingMessageAsync(message, cancellationToken);
        }

        public override Task CompleteProcessingMessageAsync(BrokeredMessage message, FunctionResult result, CancellationToken cancellationToken)
        {
            _container.GetCurrentExecutionContextScope()?.Dispose();
            return base.CompleteProcessingMessageAsync(message, result, cancellationToken);
        }
    }
}

您可以在 JobHostConfiguration 中使用自定义 MessagingProvider,例如

You can use your custom MessagingProvider in your JobHostConfiguration like

var serviceBusConfig = new ServiceBusConfiguration
{ 
    ConnectionString = config.ServiceBusConnectionString
};
serviceBusConfig.MessagingProvider = new ScopedMessagingProvider(serviceBusConfig, container);
jobHostConfig.UseServiceBus(serviceBusConfig);

  • 队列触发器:

  • QueueTrigger:

    public sealed class ScopedQueueProcessorFactory : IQueueProcessorFactory
    {
        private readonly Container _container;
    
        public ScopedQueueProcessorFactory(Container container)
        {
            _container = container;
        }
    
        public QueueProcessor Create(QueueProcessorFactoryContext context)
        {
            return new ScopedQueueProcessor(context, _container);
        }
    
        private class ScopedQueueProcessor : QueueProcessor
        {
            private readonly Container _container;
    
            public ScopedQueueProcessor(QueueProcessorFactoryContext context, Container container)
                : base(context)
            {
                _container = container;
            }
    
            public override Task<bool> BeginProcessingMessageAsync(CloudQueueMessage message, CancellationToken cancellationToken)
            {
                _container.BeginExecutionContextScope();
                return base.BeginProcessingMessageAsync(message, cancellationToken);
            }
    
            public override Task CompleteProcessingMessageAsync(CloudQueueMessage message, FunctionResult result,
                CancellationToken cancellationToken)
            {
                _container.GetCurrentExecutionContextScope()?.Dispose();
                return base.CompleteProcessingMessageAsync(message, result, cancellationToken);
            }
        }
    }
    

    您可以像这样在 JobHostConfiguration 中使用您的自定义 IQueueProcessorFactory:

    You can use your custom IQueueProcessorFactory in your JobHostConfiguration like this:

     var config = new JobHostConfiguration();
     config.Queues.QueueProcessorFactory = new ScopedQueueProcessorFactory(container);
    

  • 这篇关于用于依赖注入的 Azure 触发的 Webjobs 范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆