Skip to content

Commit

Permalink
Merge pull request #82 from RocketSurgeonsGuild/feature/configuration…
Browse files Browse the repository at this point in the history
…-enhancements

Feature/configuration enhancements
  • Loading branch information
david-driscoll committed Nov 2, 2019
2 parents 676e712 + a336724 commit e3ca294
Show file tree
Hide file tree
Showing 21 changed files with 351 additions and 84 deletions.
4 changes: 2 additions & 2 deletions Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<NoWarn>NU5105;CS0579;$(NoWarn)</NoWarn>
</PropertyGroup>
<ItemGroup>
<None Include="$(MSBuildThisFileDirectory)/.tmp/packageicon.png" Condition="Exists('$(MSBuildThisFileDirectory)/.tmp/packageicon.png')" Pack="true" PackagePath="/images/" />
<None Include="$(MSBuildThisFileDirectory)/LICENSE" Pack="true" PackagePath="/" />
<None Include="$(MSBuildThisFileDirectory)/.tmp/packageicon.png" Condition="Exists('$(MSBuildThisFileDirectory)/.tmp/packageicon.png')" Pack="true" PackagePath="/images/" Visible="false" />
<None Include="$(MSBuildThisFileDirectory)/LICENSE" Pack="true" PackagePath="/" Visible="false" />
</ItemGroup>
</Project>
2 changes: 2 additions & 0 deletions Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<PackageReference Update="Microsoft.Extensions.Configuration.Binder" Version="2.1.1" />
<PackageReference Update="Microsoft.Extensions.Configuration.CommandLine" Version="2.1.1" />
<PackageReference Update="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.1.1" />
<PackageReference Update="Microsoft.Extensions.Configuration.FileExtensions" Version="2.1.1" />
<PackageReference Update="Microsoft.Extensions.Configuration.Ini" Version="2.1.1" />
<PackageReference Update="Microsoft.Extensions.Configuration.Json" Version="2.1.1" />
<PackageReference Update="Microsoft.Extensions.Configuration.UserSecrets" Version="2.1.1" />
Expand Down Expand Up @@ -43,6 +44,7 @@
<PackageReference Update="Microsoft.Extensions.Configuration.Binder" Version="3.0.0" />
<PackageReference Update="Microsoft.Extensions.Configuration.CommandLine" Version="3.0.0" />
<PackageReference Update="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="3.0.0" />
<PackageReference Update="Microsoft.Extensions.Configuration.FileExtensions" Version="3.0.0" />
<PackageReference Update="Microsoft.Extensions.Configuration.Ini" Version="3.0.0" />
<PackageReference Update="Microsoft.Extensions.Configuration.Json" Version="3.0.0" />
<PackageReference Update="Microsoft.Extensions.Configuration.UserSecrets" Version="3.0.0" />
Expand Down
23 changes: 23 additions & 0 deletions src/Configuration.Abstractions/ConfigurationOptions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using Microsoft.Extensions.FileProviders;
using IMsftConfigurationBuilder = Microsoft.Extensions.Configuration.IConfigurationBuilder;

namespace Rocket.Surgery.Extensions.Configuration
{
/// <summary>
/// Options for configuring a hosting environment
/// </summary>
public class ConfigurationOptions
{
/// <summary>
/// Additional settings providers to be inserted after the default application settings file (typically appsettings.json)
/// </summary>
public List<Func<IMsftConfigurationBuilder, IMsftConfigurationBuilder>> ApplicationConfiguration { get; } = new List<Func<IMsftConfigurationBuilder, IMsftConfigurationBuilder>>();

/// <summary>
/// Additional settings providers to be inserted after the default environment application settings file (typically appsettings.{env}.json)
/// </summary>
public List<Func<IMsftConfigurationBuilder, string, IMsftConfigurationBuilder>> EnvironmentConfiguration { get; } = new List<Func<IMsftConfigurationBuilder, string, IMsftConfigurationBuilder>>();
}
}
2 changes: 1 addition & 1 deletion src/Configuration.Abstractions/IConfigurationBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.FileProviders;
using Rocket.Surgery.Conventions;
using Rocket.Surgery.Conventions.Reflection;
using Rocket.Surgery.Conventions.Scanners;
Expand Down
37 changes: 37 additions & 0 deletions src/Configuration.Abstractions/ProxyConfigurationBuilder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using IMsftConfigurationBuilder = Microsoft.Extensions.Configuration.IConfigurationBuilder;

namespace Rocket.Surgery.Extensions.Configuration
{
class ProxyConfigurationBuilder : IMsftConfigurationBuilder
{
private readonly IMsftConfigurationBuilder _builder;
private readonly IList<IConfigurationSource> _sources = new List<IConfigurationSource>();

public ProxyConfigurationBuilder(IMsftConfigurationBuilder builder)
{
this._builder = builder;
}

public IDictionary<string, object> Properties => _builder.Properties;

public IList<IConfigurationSource> Sources => _builder.Sources;

public IMsftConfigurationBuilder Add(IConfigurationSource source)
{
_sources.Add(source);
return this;
}

public IEnumerable<IConfigurationSource> GetAdditionalSources()
{
return _sources;
}

public IConfigurationRoot Build()
{
return _builder.Build();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using IMsftConfigurationBuilder = Microsoft.Extensions.Configuration.IConfigurationBuilder;

namespace Rocket.Surgery.Extensions.Configuration
{
static class ProxyConfigurationBuilderExtensions
{
public static T Apply<T>(this T builder, IEnumerable<Func<IMsftConfigurationBuilder, IMsftConfigurationBuilder>> builders) where T : IMsftConfigurationBuilder
{
foreach (var b in builders)
{
b(builder);
}
return builder;
}

public static T Apply<T>(this T builder, IEnumerable<Func<IMsftConfigurationBuilder, string, IMsftConfigurationBuilder>> builders, string environmentName) where T : IMsftConfigurationBuilder
{
foreach (var b in builders)
{
b(builder, environmentName);
}
return builder;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Conventions.Abstractions\Rocket.Surgery.Conventions.Abstractions.csproj" />
<InternalsVisibleTo Include="Rocket.Surgery.Hosting" />
<InternalsVisibleTo Include="Rocket.Surgery.Hosting.Functions" />
<InternalsVisibleTo Include="Rocket.Surgery.Conventions.TestHost" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" />
Expand Down
12 changes: 11 additions & 1 deletion src/Conventions.TestHost/ConventionTestHost.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Rocket.Surgery.Conventions.Reflection;
using Rocket.Surgery.Conventions.Scanners;
using Rocket.Surgery.Extensions.Configuration;
using Rocket.Surgery.Extensions.DependencyInjection;
using Rocket.Surgery.Extensions.Logging;

Expand All @@ -32,6 +35,7 @@ public class ConventionTestHost : ConventionHostBuilder<ConventionTestHost>
/// <param name="serviceProperties">The service properties.</param>
/// <param name="loggerFactory">The logger factory.</param>
/// <param name="environment">The environment.</param>
/// <param name="assembly">The assembly.</param>
internal ConventionTestHost(IConventionScanner scanner, IAssemblyCandidateFinder assemblyCandidateFinder, IAssemblyProvider assemblyProvider, DiagnosticSource diagnosticSource, IServiceProviderDictionary serviceProperties, ILoggerFactory loggerFactory, IRocketEnvironment environment) : base(scanner, assemblyCandidateFinder, assemblyProvider, diagnosticSource, serviceProperties)
{
serviceProperties.Set(HostType.UnitTestHost);
Expand Down Expand Up @@ -63,7 +67,13 @@ public ConventionTestHost IncludeConventionAttributes()
/// </summary>
private (IConfigurationRoot Configuration, ServicesBuilder ServicesBuilder) Init()
{
var configurationBuilder = new ConfigurationBuilder();
var configurationOptions = this.GetOrAdd(() => new ConfigurationOptions());
var configurationBuilder = new Microsoft.Extensions.Configuration.ConfigurationBuilder()
.SetFileProvider(_environment.ContentRootFileProvider)
.Apply(configurationOptions.ApplicationConfiguration)
.Apply(configurationOptions.EnvironmentConfiguration, _environment.EnvironmentName)
.Apply(configurationOptions.EnvironmentConfiguration, "local");

var cb = new Rocket.Surgery.Extensions.Configuration.ConfigurationBuilder(
Scanner,
_environment,
Expand Down
82 changes: 64 additions & 18 deletions src/Conventions.TestHost/ConventionTestHostBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyModel;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Rocket.Surgery.Conventions;
using Rocket.Surgery.Conventions.Reflection;
using Rocket.Surgery.Conventions.Scanners;
using Rocket.Surgery.Extensions.Configuration;

namespace Rocket.Surgery.Conventions.TestHost
{
Expand All @@ -24,6 +28,29 @@ public class ConventionTestHostBuilder
private ILogger? _logger;
private DiagnosticSource? _diagnosticSource;
private IRocketEnvironment? _environment;
private Assembly _assembly;

/// <summary>
/// Default constructor
/// </summary>
public ConventionTestHostBuilder()
{
_serviceProperties.Set(new ConfigurationOptions()
{
ApplicationConfiguration = {
(builder) => builder.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true),
(builder) => builder.AddYamlFile("appsettings.yml", optional: true, reloadOnChange: true),
(builder) => builder.AddYamlFile("appsettings.yaml", optional: true, reloadOnChange: true),
(builder) => builder.AddIniFile("appsettings.ini", optional: true, reloadOnChange: true),
},
EnvironmentConfiguration = {
(builder, environmentName) => builder.AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true),
(builder, environmentName) => builder.AddYamlFile($"appsettings.{environmentName}.yml", optional: true, reloadOnChange: true),
(builder, environmentName) => builder.AddYamlFile($"appsettings.{environmentName}.yaml", optional: true, reloadOnChange: true),
(builder, environmentName) => builder.AddIniFile($"appsettings.{environmentName}.ini", optional: true, reloadOnChange: true),
}
});
}

/// <summary>
/// Create a convention test host build for the given <see cref="DependencyContext" /> in the assembly.
Expand All @@ -32,7 +59,7 @@ public class ConventionTestHostBuilder
/// <param name="loggerFactory">Optional logger factory.</param>
public static ConventionTestHostBuilder For(Type type, ILoggerFactory? loggerFactory = null)
{
return For(DependencyContext.Load(type.Assembly), loggerFactory);
return For(DependencyContext.Load(type.Assembly), type.Assembly, loggerFactory);
}

/// <summary>
Expand All @@ -42,7 +69,7 @@ public static ConventionTestHostBuilder For(Type type, ILoggerFactory? loggerFac
/// <param name="loggerFactory">Optional logger factory.</param>
public static ConventionTestHostBuilder For(object instance, ILoggerFactory? loggerFactory = null)
{
return For(DependencyContext.Load(instance.GetType().Assembly), loggerFactory);
return For(DependencyContext.Load(instance.GetType().Assembly), instance.GetType().Assembly, loggerFactory);
}

/// <summary>
Expand All @@ -52,14 +79,15 @@ public static ConventionTestHostBuilder For(object instance, ILoggerFactory? log
/// <param name="loggerFactory">Optional logger factory.</param>
public static ConventionTestHostBuilder For(Assembly assembly, ILoggerFactory? loggerFactory = null)
{
return For(DependencyContext.Load(assembly), loggerFactory);
return For(DependencyContext.Load(assembly), assembly, loggerFactory);
}

/// <summary>
/// Create a convention test host build for the given <see cref="DependencyContext" /> in the assembly.
/// </summary>
/// <param name="context">The context that that will be used for the test host.</param>
/// <param name="loggerFactory">Optional logger factory.</param>
[Obsolete("No longer to be used, has been replaced with the overload that takes the assembly and loads the context from that")]
public static ConventionTestHostBuilder For(DependencyContext context, ILoggerFactory? loggerFactory = null)
{
loggerFactory ??= NullLoggerFactory.Instance;
Expand All @@ -71,6 +99,24 @@ public static ConventionTestHostBuilder For(DependencyContext context, ILoggerFa
;
}

/// <summary>
/// Create a convention test host build for the given <see cref="DependencyContext" /> in the assembly.
/// </summary>
/// <param name="context">The context that that will be used for the test host.</param>
/// <param name="assembly">The assembly that that will be used to load the <see cref="DependencyContext" />.</param>
/// <param name="loggerFactory">Optional logger factory.</param>
public static ConventionTestHostBuilder For(DependencyContext context, Assembly assembly, ILoggerFactory? loggerFactory = null)
{
loggerFactory ??= NullLoggerFactory.Instance;
var logger = loggerFactory.CreateLogger(nameof(ConventionTestHostBuilder));
return new ConventionTestHostBuilder()
.With(loggerFactory)
.With(assembly)
.With(new DependencyContextAssemblyProvider(context, logger))
.With(new DependencyContextAssemblyCandidateFinder(context, logger))
;
}

/// <summary>
/// Use the specific <see cref="IConventionScanner" />
/// </summary>
Expand All @@ -92,6 +138,16 @@ public ConventionTestHostBuilder With(IAssemblyCandidateFinder assemblyCandidate
return this;
}

/// <summary>
/// Use the specific <see cref="Assembly" />
/// </summary>
/// <param name="assembly">The assembly.</param>
public ConventionTestHostBuilder With(Assembly assembly)
{
_assembly = assembly;
return this;
}

/// <summary>
/// Use the specific <see cref="IAssemblyProvider" />
/// </summary>
Expand Down Expand Up @@ -156,20 +212,7 @@ public ConventionTestHostBuilder With(IRocketEnvironment environment)
/// Create the convention test host with the given defaults
/// </summary>
/// <returns></returns>
public ConventionTestHost Create()
{
var assemblyCandidateFinder = _assemblyCandidateFinder ?? throw new ArgumentNullException("AssemblyCandidateFinder");
var assemblyProvider = _assemblyProvider ?? throw new ArgumentNullException("AssemblyProvider");
return new ConventionTestHost(
_scanner ?? new SimpleConventionScanner(assemblyCandidateFinder, _serviceProperties, _logger ?? NullLogger.Instance),
assemblyCandidateFinder,
assemblyProvider,
_diagnosticSource ?? new DiagnosticListener(nameof(ConventionTestHost)),
_serviceProperties,
_loggerFactory ?? NullLoggerFactory.Instance,
_environment ?? new RocketEnvironment("Test", nameof(ConventionTestHost), null, null)
);
}
public ConventionTestHost Create() => Create(_ => { });

/// <summary>
/// Create the convention test host with the given defaults
Expand All @@ -179,14 +222,17 @@ public ConventionTestHost Create(Action<IConventionHostBuilder> action)
{
var assemblyCandidateFinder = _assemblyCandidateFinder ?? throw new ArgumentNullException("AssemblyCandidateFinder");
var assemblyProvider = _assemblyProvider ?? throw new ArgumentNullException("AssemblyProvider");

var contentRootPath = _assembly != null && Directory.Exists(Path.GetDirectoryName(_assembly.Location)) ? Path.GetDirectoryName(_assembly.Location) : string.Empty;
var contentProvider = !string.IsNullOrWhiteSpace(contentRootPath) ? new PhysicalFileProvider(contentRootPath) : new NullFileProvider() as IFileProvider;
var builder = new ConventionTestHost(
_scanner ?? new SimpleConventionScanner(assemblyCandidateFinder, _serviceProperties, _logger ?? NullLogger.Instance),
assemblyCandidateFinder,
assemblyProvider,
_diagnosticSource ?? new DiagnosticListener(nameof(ConventionTestHost)),
_serviceProperties,
_loggerFactory ?? NullLoggerFactory.Instance,
_environment ?? new RocketEnvironment("Test", nameof(ConventionTestHost), null, null)
_environment ?? new RocketEnvironment("Test", nameof(ConventionTestHost), contentRootPath, contentProvider)
);
action(builder);
return builder;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,14 @@
<PackageTags>$(PackageTags);reflection;unit test;testhost</PackageTags>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" />
<ProjectReference Include="..\Conventions\Rocket.Surgery.Conventions.csproj" />
<ProjectReference Include="..\DependencyInjection\Rocket.Surgery.Extensions.DependencyInjection.csproj" />
<ProjectReference Include="..\Configuration\Rocket.Surgery.Extensions.Configuration.csproj" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" />
<PackageReference Include="Microsoft.Extensions.Configuration.Ini" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" />
<PackageReference Include="NetEscapades.Configuration.Yaml" />
</ItemGroup>
<ItemGroup>
</ItemGroup>
Expand Down
1 change: 1 addition & 0 deletions src/Hosting.Abstractions/IRocketHostBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Rocket.Surgery.Conventions;
Expand Down
2 changes: 1 addition & 1 deletion src/Hosting.Functions/RocketBooster.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public static class RocketBooster
DependencyContext dependencyContext,
DiagnosticSource? diagnosticSource = null)
{
return (builder , startupInstance) =>
return (builder, startupInstance) =>
{
var b = RocketHostExtensions.GetOrCreateBuilder(builder, startupInstance, null);
if (diagnosticSource != null)
Expand Down

0 comments on commit e3ca294

Please sign in to comment.