Skip to content

Commit

Permalink
Merge pull request #34 from AMalininHere/lazy-pipeline-configuration
Browse files Browse the repository at this point in the history
[Breaking change] configure pipeline during deps resolution instead of registration
  • Loading branch information
TechnoBerry authored Aug 18, 2021
2 parents d63311a + d936c70 commit 16abea0
Show file tree
Hide file tree
Showing 5 changed files with 17 additions and 14 deletions.
11 changes: 7 additions & 4 deletions src/Camunda.Worker/CamundaWorkerBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,13 @@ public ICamundaWorkerBuilder AddHandler(ExternalTaskDelegate handler, HandlerMet
public ICamundaWorkerBuilder ConfigurePipeline(Action<IPipelineBuilder> configureAction)
{
Guard.NotNull(configureAction, nameof(configureAction));
var builder = new PipelineBuilder(Services);
configureAction(builder);
var externalTaskDelegate = builder.Build(PipelineBuilder.RouteAsync);
Services.AddSingleton(new WorkerHandlerDescriptor(externalTaskDelegate));
Services.AddSingleton(provider =>
{
var builder = new PipelineBuilder(provider);
configureAction(builder);
var externalTaskDelegate = builder.Build(PipelineBuilder.RouteAsync);
return new WorkerHandlerDescriptor(externalTaskDelegate);
});
return this;
}
}
Expand Down
3 changes: 1 addition & 2 deletions src/Camunda.Worker/IPipelineBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
using System;
using Microsoft.Extensions.DependencyInjection;

namespace Camunda.Worker
{
public interface IPipelineBuilder
{
IServiceCollection Services { get; }
IServiceProvider ApplicationServices { get; }

IPipelineBuilder Use(Func<ExternalTaskDelegate, ExternalTaskDelegate> middleware);

Expand Down
6 changes: 3 additions & 3 deletions src/Camunda.Worker/PipelineBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ public class PipelineBuilder : IPipelineBuilder
private readonly IList<Func<ExternalTaskDelegate, ExternalTaskDelegate>> _middlewareList =
new List<Func<ExternalTaskDelegate, ExternalTaskDelegate>>();

public PipelineBuilder(IServiceCollection services)
public PipelineBuilder(IServiceProvider serviceProvider)
{
Services = services;
ApplicationServices = serviceProvider;
}

public IServiceCollection Services { get; }
public IServiceProvider ApplicationServices { get; }

public IPipelineBuilder Use(Func<ExternalTaskDelegate, ExternalTaskDelegate> middleware)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Camunda.Worker/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public static ICamundaWorkerBuilder AddCamundaWorker(
services.TryAddTransient<ICamundaWorker, DefaultCamundaWorker>();
services.TryAddTransient<IExternalTaskRouter, ExternalTaskRouter>();
services.TryAddSingleton<IEndpointProvider, TopicBasedEndpointProvider>();
services.TryAddSingleton(new WorkerHandlerDescriptor(PipelineBuilder.RouteAsync));
services.TryAddSingleton(_ => new WorkerHandlerDescriptor(PipelineBuilder.RouteAsync));
services.AddHostedService(provider => new WorkerHostedService(provider, numberOfWorkers));

return new CamundaWorkerBuilder(services, workerId);
Expand Down
9 changes: 5 additions & 4 deletions test/Camunda.Worker.Tests/PipelineBuilderTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Camunda.Worker.Execution;
using Microsoft.Extensions.DependencyInjection;
using Moq;
using Xunit;
Expand All @@ -12,20 +11,22 @@ namespace Camunda.Worker
public class PipelineBuilderTest
{
private readonly Mock<IExternalTaskContext> _contextMock = new();
private readonly IServiceCollection _services = new ServiceCollection();
private readonly IServiceProvider _serviceProvider;

public PipelineBuilderTest()
{
var services = new ServiceCollection();
_serviceProvider = services.BuildServiceProvider();
_contextMock.SetupGet(ctx => ctx.ServiceProvider)
.Returns(_services.BuildServiceProvider());
.Returns(_serviceProvider);
}

[Theory]
[InlineData(10)]
[InlineData(100)]
public async Task TestBuildPipeline(int calls)
{
IPipelineBuilder builder = new PipelineBuilder(_services);
IPipelineBuilder builder = new PipelineBuilder(_serviceProvider);

Task LastDelegate(IExternalTaskContext context)
{
Expand Down

0 comments on commit 16abea0

Please sign in to comment.