Skip to content

Commit ff84224

Browse files
authored
Merge pull request #21 from altso/di-processor
Expose IExcelFunctionsProcessor
2 parents 5cb3d11 + ceb6c5e commit ff84224

6 files changed

+71
-37
lines changed

Source/ExcelRna.Extensions.Hosting.Tests/ExcelFunctionsRegistrarTests.cs

+15-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
using System.Collections.Generic;
12
using System.Threading;
23
using System.Threading.Tasks;
4+
using ExcelDna.Registration;
35
using Moq;
46
using Xunit;
57

@@ -13,7 +15,11 @@ public async Task StartAsync_should_register_functions()
1315
// ARRANGE
1416
var excelFunctionsProvider = new Mock<IExcelFunctionsProvider>();
1517
bool registered = false;
16-
ExcelFunctionsRegistrar excelFunctionsRegistrar = new(excelFunctionsProvider.Object, new NoopExcelFunctionsProcessor()) { RegisterFunctions = _ => { registered = true; } };
18+
ExcelFunctionsRegistrar excelFunctionsRegistrar =
19+
new(excelFunctionsProvider.Object, new[] { new TestProcessor() })
20+
{
21+
RegisterFunctions = _ => { registered = true; }
22+
};
1723

1824
// ACT
1925
await excelFunctionsRegistrar.StartAsync(CancellationToken.None);
@@ -27,12 +33,19 @@ public void StopAsync_is_noop()
2733
{
2834
// ARRANGE
2935
var excelFunctionsProvider = new Mock<IExcelFunctionsProvider>();
30-
ExcelFunctionsRegistrar excelFunctionsRegistrar = new(excelFunctionsProvider.Object, new NoopExcelFunctionsProcessor());
36+
ExcelFunctionsRegistrar excelFunctionsRegistrar =
37+
new(excelFunctionsProvider.Object, new[] { new TestProcessor() });
3138

3239
// ACT
3340
Task stopTask = excelFunctionsRegistrar.StopAsync(CancellationToken.None);
3441

3542
// ASSERT
3643
Assert.Equal(Task.CompletedTask, stopTask);
3744
}
45+
46+
private class TestProcessor : IExcelFunctionsProcessor
47+
{
48+
public IEnumerable<ExcelFunctionRegistration> Process(IEnumerable<ExcelFunctionRegistration> registrations) =>
49+
registrations;
50+
}
3851
}

Source/ExcelRna.Extensions.Hosting.Tests/NoopFunctionsProcessorTests.cs

-22
This file was deleted.

Source/ExcelRna.Extensions.Hosting.Tests/ServiceCollectionExtensionsTests.cs

+37-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Collections.Generic;
23
using System.Linq;
34
using System.Linq.Expressions;
@@ -22,7 +23,8 @@ public void AddExcelFunctions_should_add_functions_type()
2223

2324
// ASSERT
2425
var provider = services.BuildServiceProvider();
25-
IEnumerable<IExcelFunctionsDeclaration> declarations = provider.GetRequiredService<IEnumerable<IExcelFunctionsDeclaration>>();
26+
IEnumerable<IExcelFunctionsDeclaration> declarations =
27+
provider.GetRequiredService<IEnumerable<IExcelFunctionsDeclaration>>();
2628
Assert.Collection(declarations,
2729
a => Assert.Equal(typeof(TestFunctionsA), a.ExcelFunctionsType),
2830
b => Assert.Equal(typeof(TestFunctionsB), b.ExcelFunctionsType));
@@ -47,6 +49,7 @@ public void AddExcelRibbon_should_add_loader()
4749
}
4850

4951
[Fact]
52+
[Obsolete]
5053
public void AddExcelFunctionsProcessor_should_add_processor()
5154
{
5255
// ARRANGE
@@ -63,6 +66,23 @@ public void AddExcelFunctionsProcessor_should_add_processor()
6366
Assert.Single(processor.Process(Enumerable.Empty<ExcelFunctionRegistration>()));
6467
}
6568

69+
[Fact]
70+
public void AddExcelFunctionsProcessor_should_add_multiple_processors()
71+
{
72+
// ARRANGE
73+
var services = new ServiceCollection();
74+
services.AddTransient<TestDependency>();
75+
76+
// ACT
77+
services.AddExcelFunctionsProcessor<TestProcessorA>();
78+
services.AddExcelFunctionsProcessor<TestProcessorB>();
79+
80+
// ASSERT
81+
ServiceProvider serviceProvider = services.BuildServiceProvider();
82+
IEnumerable<IExcelFunctionsProcessor> processors = serviceProvider.GetRequiredService<IEnumerable<IExcelFunctionsProcessor>>();
83+
Assert.Collection(processors, a => Assert.IsType<TestProcessorA>(a), b => Assert.IsType<TestProcessorB>(b));
84+
}
85+
6686
private class TestFunctionsA
6787
{
6888
}
@@ -83,4 +103,20 @@ private class TestDependency
83103
{
84104
public ExcelFunctionRegistration Registration { get; } = new(Expression.Lambda(Expression.Constant(null)));
85105
}
106+
107+
private class TestProcessorA : IExcelFunctionsProcessor
108+
{
109+
private readonly TestDependency _dependency;
110+
111+
public TestProcessorA(TestDependency dependency) => _dependency = dependency;
112+
113+
public IEnumerable<ExcelFunctionRegistration> Process(IEnumerable<ExcelFunctionRegistration> registrations) =>
114+
registrations.Concat(new[] { _dependency.Registration });
115+
}
116+
117+
private class TestProcessorB : IExcelFunctionsProcessor
118+
{
119+
public IEnumerable<ExcelFunctionRegistration> Process(IEnumerable<ExcelFunctionRegistration> registrations) =>
120+
throw new NotImplementedException();
121+
}
86122
}

Source/ExcelRna.Extensions.Hosting/ExcelFunctionsRegistrar.cs

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using System.Threading;
45
using System.Threading.Tasks;
56
using ExcelDna.Registration;
@@ -10,20 +11,21 @@ namespace ExcelRna.Extensions.Hosting;
1011
internal class ExcelFunctionsRegistrar : IHostedService
1112
{
1213
private readonly IExcelFunctionsProvider _excelFunctionsProvider;
13-
private readonly IExcelFunctionsProcessor _excelFunctionsProcessor;
14+
private readonly IEnumerable<IExcelFunctionsProcessor> _excelFunctionsProcessors;
1415

15-
public ExcelFunctionsRegistrar(IExcelFunctionsProvider excelFunctionsProvider, IExcelFunctionsProcessor excelFunctionsProcessor)
16+
public ExcelFunctionsRegistrar(IExcelFunctionsProvider excelFunctionsProvider, IEnumerable<IExcelFunctionsProcessor> excelFunctionsProcessors)
1617
{
1718
_excelFunctionsProvider = excelFunctionsProvider;
18-
_excelFunctionsProcessor = excelFunctionsProcessor;
19+
_excelFunctionsProcessors = excelFunctionsProcessors;
1920
}
2021

2122
internal Action<IEnumerable<ExcelFunctionRegistration>> RegisterFunctions { get; set; } = functions => functions.RegisterFunctions();
2223

2324
public Task StartAsync(CancellationToken cancellationToken)
2425
{
25-
IEnumerable<ExcelFunctionRegistration> functions = _excelFunctionsProcessor
26-
.Process(_excelFunctionsProvider.GetExcelFunctions());
26+
var functions = _excelFunctionsProcessors.Aggregate(
27+
_excelFunctionsProvider.GetExcelFunctions(),
28+
(current, excelFunctionsProcessor) => excelFunctionsProcessor.Process(current));
2729
RegisterFunctions(functions);
2830
return Task.CompletedTask;
2931
}

Source/ExcelRna.Extensions.Hosting/IExcelFunctionsProcessor.cs

+1-6
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,11 @@
44

55
namespace ExcelRna.Extensions.Hosting;
66

7-
internal interface IExcelFunctionsProcessor
7+
public interface IExcelFunctionsProcessor
88
{
99
IEnumerable<ExcelFunctionRegistration> Process(IEnumerable<ExcelFunctionRegistration> registrations);
1010
}
1111

12-
internal class NoopExcelFunctionsProcessor : IExcelFunctionsProcessor
13-
{
14-
public IEnumerable<ExcelFunctionRegistration> Process(IEnumerable<ExcelFunctionRegistration> registrations) => registrations;
15-
}
16-
1712
internal class ExcelFunctionsProcessor : IExcelFunctionsProcessor
1813
{
1914
private readonly Func<IEnumerable<ExcelFunctionRegistration>, IEnumerable<ExcelFunctionRegistration>> _process;

Source/ExcelRna.Extensions.Hosting/ServiceCollectionExtensions.cs

+11-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ public static IServiceCollection AddExcelFunctions<T>(this IServiceCollection se
1515
services.AddHostedService<ExcelFunctionsRegistrar>();
1616

1717
services.AddSingleton<T>();
18-
services.TryAddEnumerable(ServiceDescriptor.Singleton<IExcelFunctionsDeclaration, ExcelFunctionsDeclaration<T>>());
18+
services.TryAddEnumerable(
19+
ServiceDescriptor.Singleton<IExcelFunctionsDeclaration, ExcelFunctionsDeclaration<T>>());
1920

2021
return services;
2122
}
@@ -28,13 +29,22 @@ public static IServiceCollection AddExcelRibbon<T>(this IServiceCollection servi
2829
return services;
2930
}
3031

32+
[Obsolete("Please use AddExcelFunctionsProcessor<TProcessor>()")]
3133
public static IServiceCollection AddExcelFunctionsProcessor(this IServiceCollection services, Func<IEnumerable<ExcelFunctionRegistration>, IEnumerable<ExcelFunctionRegistration>> process)
3234
{
3335
return services.AddSingleton<IExcelFunctionsProcessor>(new ExcelFunctionsProcessor(process));
3436
}
3537

38+
[Obsolete("Please use AddExcelFunctionsProcessor<TProcessor>()")]
3639
public static IServiceCollection AddExcelFunctionsProcessor(this IServiceCollection services, Func<IEnumerable<ExcelFunctionRegistration>, IServiceProvider, IEnumerable<ExcelFunctionRegistration>> process)
3740
{
3841
return services.AddSingleton<IExcelFunctionsProcessor>(provider => new ExcelFunctionsProcessor(functions => process(functions, provider)));
3942
}
43+
44+
public static IServiceCollection AddExcelFunctionsProcessor<TProcessor>(this IServiceCollection services)
45+
where TProcessor : class, IExcelFunctionsProcessor
46+
{
47+
services.TryAddEnumerable(ServiceDescriptor.Singleton<IExcelFunctionsProcessor, TProcessor>());
48+
return services;
49+
}
4050
}

0 commit comments

Comments
 (0)