依赖注入 – Azure触发的Webjobs依赖注入的范围
我已阅读并询问有关如何使用WebJob以及特别是Triggered Webjobs使用DI的一些问题.
> SimpleInjector – Azure WebJob with TimerTrigger – Register IDisposable 我仍然试图找出如何在触发的webjobs中优雅地整合DI,并且@Steven问我一个很好的问题:
我知道我可以在触发函数中启动一个范围但是我想知道sdk中是否有任何可扩展性点允许我们进行范围设定? 谢谢.
我已经向Azure Webjob团队打开了一个
Add IDependencyScope to handle scoping请求.
我创建了一个小型库来收集Azure Webjobs和SimpleInjector的类: > Nuget download 对于QueueTrigger和ServiceBustrigger,我来到这些解决方案: > ServiceBusTrigger(来自这个回答:https://stackoverflow.com/a/33759649/4167200): 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 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); } public override Task CompleteProcessingMessageAsync(CloudQueueMessage message,cancellationToken); } } } 您可以在JobHostConfiguration中使用自定义IQueueProcessorFactory,如下所示: var config = new JobHostConfiguration(); config.Queues.QueueProcessorFactory = new ScopedQueueProcessorFactory(container); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |