-
Notifications
You must be signed in to change notification settings - Fork 25
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add convenience ServiceCollectionExtensions
- Loading branch information
Showing
4 changed files
with
263 additions
and
51 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
168 changes: 168 additions & 0 deletions
168
src/PipelineNet.ServiceProvider.Tests/ServiceCollectionExtensionsTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
using Microsoft.Extensions.DependencyInjection; | ||
using Microsoft.Extensions.Logging; | ||
using PipelineNet.Middleware; | ||
using PipelineNet.Pipelines; | ||
using PipelineNet.ServiceProvider.Pipelines.Factories; | ||
|
||
namespace PipelineNet.ServiceProvider.Tests | ||
{ | ||
public class ServiceCollectionExtensionsTests | ||
{ | ||
#region Parameter definitions | ||
public class Image | ||
{ | ||
public static Image FromFile(string filename) => new Bitmap(); | ||
} | ||
|
||
public class Bitmap : Image | ||
{ | ||
} | ||
#endregion | ||
|
||
#region Service definitions | ||
public interface IMyService | ||
{ | ||
Task DoSomething(); | ||
} | ||
|
||
public class MyService : IMyService | ||
{ | ||
private readonly IAsyncPipelineFactory<Bitmap> _pipelineFactory; | ||
|
||
public MyService(IAsyncPipelineFactory<Bitmap> pipelineFactory) | ||
{ | ||
_pipelineFactory = pipelineFactory; | ||
} | ||
|
||
public async Task DoSomething() | ||
{ | ||
IAsyncPipeline<Bitmap> pipeline = _pipelineFactory.Create() | ||
.Add<RoudCornersAsyncMiddleware>() | ||
.Add<AddTransparencyAsyncMiddleware>() | ||
.Add<AddWatermarkAsyncMiddleware>(); | ||
|
||
Bitmap image = (Bitmap) Image.FromFile("party-photo.png"); | ||
|
||
await pipeline.Execute(image); | ||
} | ||
} | ||
#endregion | ||
|
||
#region Middleware definitions | ||
public class RoudCornersAsyncMiddleware : IAsyncMiddleware<Bitmap> | ||
{ | ||
private readonly ILogger<RoudCornersAsyncMiddleware> _logger; | ||
|
||
public RoudCornersAsyncMiddleware(ILogger<RoudCornersAsyncMiddleware> logger) | ||
{ | ||
_logger = logger; | ||
} | ||
|
||
public async Task Run(Bitmap parameter, Func<Bitmap, Task> next) | ||
{ | ||
_logger.LogInformation("Running RoudCornersAsyncMiddleware."); | ||
// Handle somehow | ||
await next(parameter); | ||
} | ||
} | ||
|
||
public class AddTransparencyAsyncMiddleware : IAsyncMiddleware<Bitmap> | ||
{ | ||
private readonly ILogger<AddTransparencyAsyncMiddleware> _logger; | ||
|
||
public AddTransparencyAsyncMiddleware(ILogger<AddTransparencyAsyncMiddleware> logger) | ||
{ | ||
_logger = logger; | ||
} | ||
|
||
public async Task Run(Bitmap parameter, Func<Bitmap, Task> next) | ||
{ | ||
_logger.LogInformation("Running AddTransparencyAsyncMiddleware."); | ||
// Handle somehow | ||
await next(parameter); | ||
} | ||
} | ||
|
||
public class AddWatermarkAsyncMiddleware : IAsyncMiddleware<Bitmap> | ||
{ | ||
private readonly ILogger<AddWatermarkAsyncMiddleware> _logger; | ||
|
||
public AddWatermarkAsyncMiddleware(ILogger<AddWatermarkAsyncMiddleware> logger) | ||
{ | ||
_logger = logger; | ||
} | ||
|
||
public async Task Run(Bitmap parameter, Func<Bitmap, Task> next) | ||
{ | ||
_logger.LogInformation("Running AddWatermarkAsyncMiddleware."); | ||
// Handle somehow | ||
await next(parameter); | ||
} | ||
} | ||
#endregion | ||
|
||
#region Logger definitions | ||
public class TestLoggerProvider : ILoggerProvider | ||
{ | ||
private readonly List<string> _messages; | ||
|
||
public TestLoggerProvider(List<string> messages) | ||
{ | ||
_messages = messages; | ||
} | ||
|
||
public ILogger CreateLogger(string categoryName) => | ||
new TestLogger(_messages); | ||
|
||
public void Dispose() | ||
{ | ||
} | ||
} | ||
|
||
public class TestLogger : ILogger | ||
{ | ||
private readonly List<string> _messages; | ||
|
||
public TestLogger(List<string> messages) | ||
{ | ||
_messages = messages; | ||
} | ||
|
||
public IDisposable? BeginScope<TState>(TState state) where TState : notnull => | ||
new NullScope(); | ||
|
||
public bool IsEnabled(LogLevel logLevel) => true; | ||
|
||
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter) => | ||
_messages.Add(formatter(state, exception)); | ||
|
||
private class NullScope : IDisposable | ||
{ | ||
public void Dispose() | ||
{ | ||
} | ||
} | ||
} | ||
#endregion | ||
|
||
[Fact] | ||
public async Task AddPipelineNet_Works_Readme() | ||
{ | ||
var messages = new List<string>(); | ||
var serviceProvider = new ServiceCollection() | ||
.AddLogging(bulider => bulider.Services.AddSingleton<ILoggerProvider>(new TestLoggerProvider(messages))) | ||
.AddPipelineNet(typeof(RoudCornersAsyncMiddleware).Assembly) | ||
.AddScoped<IMyService, MyService>() | ||
.BuildServiceProvider(); | ||
var scope = serviceProvider.CreateScope(); | ||
var service = scope.ServiceProvider.GetRequiredService<IMyService>(); | ||
|
||
await service.DoSomething(); | ||
|
||
Assert.Equal(3, messages.Count); | ||
Assert.Equal("Running RoudCornersAsyncMiddleware.", messages[0]); | ||
Assert.Equal("Running AddTransparencyAsyncMiddleware.", messages[1]); | ||
Assert.Equal("Running AddWatermarkAsyncMiddleware.", messages[2]); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters