Add overload of UseTypeActivator(...) that accepts an instance of IServiceProvider

This commit is contained in:
Oleksii Holub
2022-06-07 20:08:34 +03:00
parent 6e0d881682
commit ff25dccf8a
3 changed files with 56 additions and 4 deletions

View File

@@ -14,6 +14,7 @@
<PackageReference Include="FluentAssertions" Version="6.7.0" />
<PackageReference Include="GitHubActionsTestLogger" Version="2.0.0" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.2.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5" PrivateAssets="all" />

View File

@@ -4,6 +4,7 @@ using System.Threading.Tasks;
using CliFx.Infrastructure;
using CliFx.Tests.Utils;
using FluentAssertions;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
using Xunit.Abstractions;
@@ -87,7 +88,7 @@ public class Command : ICommand
}
[Fact]
public async Task Delegate_type_activator_can_initialize_a_type_using_a_custom_function()
public async Task Custom_type_activator_can_initialize_a_type_using_a_given_function()
{
// Arrange
var commandType = DynamicCommandBuilder.Compile(
@@ -110,7 +111,7 @@ public class Command : ICommand
var application = new CliApplicationBuilder()
.AddCommand(commandType)
.UseConsole(FakeConsole)
.UseTypeActivator(type => Activator.CreateInstance(type, "hello world")!)
.UseTypeActivator(type => Activator.CreateInstance(type, "Hello world")!)
.Build();
// Act
@@ -123,11 +124,55 @@ public class Command : ICommand
// Assert
exitCode.Should().Be(0);
stdOut.Trim().Should().Be("hello world");
stdOut.Trim().Should().Be("Hello world");
}
[Fact]
public async Task Delegate_type_activator_fails_if_the_underlying_function_returns_null()
public async Task Custom_type_activator_can_initialize_a_type_using_a_service_provider()
{
// Arrange
var commandType = DynamicCommandBuilder.Compile(
// language=cs
@"
[Command]
public class Command : ICommand
{
private readonly string _foo;
public Command(string foo) => _foo = foo;
public ValueTask ExecuteAsync(IConsole console)
{
console.Output.WriteLine(_foo);
return default;
}
}");
var serviceProvider = new ServiceCollection()
.AddSingleton(commandType, Activator.CreateInstance(commandType, "Hello world")!)
.BuildServiceProvider();
var application = new CliApplicationBuilder()
.AddCommand(commandType)
.UseConsole(FakeConsole)
.UseTypeActivator(serviceProvider)
.Build();
// Act
var exitCode = await application.RunAsync(
Array.Empty<string>(),
new Dictionary<string, string>()
);
var stdOut = FakeConsole.ReadOutputString();
// Assert
exitCode.Should().Be(0);
stdOut.Trim().Should().Be("Hello world");
}
[Fact]
public async Task Custom_type_activator_fails_if_the_underlying_function_returns_null()
{
// Arrange
var commandType = DynamicCommandBuilder.Compile(

View File

@@ -182,6 +182,12 @@ public partial class CliApplicationBuilder
public CliApplicationBuilder UseTypeActivator(Func<Type, object> typeActivator) =>
UseTypeActivator(new DelegateTypeActivator(typeActivator));
/// <summary>
/// Configures the application to use the specified service provider for activating types.
/// </summary>
public CliApplicationBuilder UseTypeActivator(IServiceProvider serviceProvider) =>
UseTypeActivator(serviceProvider.GetService);
/// <summary>
/// Creates a configured instance of <see cref="CliApplication"/>.
/// </summary>