diff --git a/samples/ElmPageSample/Startup.cs b/samples/ElmPageSample/Startup.cs index fad9ba2adb..14b0873b00 100644 --- a/samples/ElmPageSample/Startup.cs +++ b/samples/ElmPageSample/Startup.cs @@ -12,9 +12,7 @@ namespace ElmPageSample { public void ConfigureServices(IServiceCollection services) { - services.AddElm(); - - services.ConfigureElm(elmOptions => + services.AddElm(elmOptions => { elmOptions.Filter = (loggerName, loglevel) => loglevel == LogLevel.Debug; }); diff --git a/src/Microsoft.AspNetCore.Diagnostics.Elm/ElmExtensions.cs b/src/Microsoft.AspNetCore.Diagnostics.Elm/ElmExtensions.cs index 35b19e038e..cb6c68c26a 100644 --- a/src/Microsoft.AspNetCore.Diagnostics.Elm/ElmExtensions.cs +++ b/src/Microsoft.AspNetCore.Diagnostics.Elm/ElmExtensions.cs @@ -23,9 +23,8 @@ namespace Microsoft.AspNetCore.Builder // add the elm provider to the factory here so the logger can start capturing logs immediately var factory = app.ApplicationServices.GetRequiredService(); - var store = app.ApplicationServices.GetRequiredService(); - var options = app.ApplicationServices.GetService>(); - factory.AddProvider(new ElmLoggerProvider(store, options?.Value ?? new ElmOptions())); + var provider = app.ApplicationServices.GetRequiredService(); + factory.AddProvider(provider); return app.UseMiddleware(); } diff --git a/src/Microsoft.AspNetCore.Diagnostics.Elm/ElmLoggerProvider.cs b/src/Microsoft.AspNetCore.Diagnostics.Elm/ElmLoggerProvider.cs index a6d71b5e08..678ddac55c 100644 --- a/src/Microsoft.AspNetCore.Diagnostics.Elm/ElmLoggerProvider.cs +++ b/src/Microsoft.AspNetCore.Diagnostics.Elm/ElmLoggerProvider.cs @@ -3,6 +3,7 @@ using System; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; namespace Microsoft.AspNetCore.Diagnostics.Elm { @@ -11,7 +12,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Elm private readonly ElmStore _store; private readonly ElmOptions _options; - public ElmLoggerProvider(ElmStore store, ElmOptions options) + public ElmLoggerProvider(ElmStore store, IOptions options) { if (store == null) { @@ -24,7 +25,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Elm } _store = store; - _options = options; + _options = options.Value; } public ILogger CreateLogger(string name) diff --git a/src/Microsoft.AspNetCore.Diagnostics.Elm/ElmServiceCollectionExtensions.cs b/src/Microsoft.AspNetCore.Diagnostics.Elm/ElmServiceCollectionExtensions.cs index 91fa27a394..d7a5fc36d5 100644 --- a/src/Microsoft.AspNetCore.Diagnostics.Elm/ElmServiceCollectionExtensions.cs +++ b/src/Microsoft.AspNetCore.Diagnostics.Elm/ElmServiceCollectionExtensions.cs @@ -3,45 +3,50 @@ using System; using Microsoft.AspNetCore.Diagnostics.Elm; +using Microsoft.Extensions.DependencyInjection.Extensions; namespace Microsoft.Extensions.DependencyInjection { + /// + /// Extension methods for setting up Elm services in an . + /// public static class ElmServiceCollectionExtensions { /// - /// Registers an and configures default . + /// Adds error logging middleware services to the specified . /// - public static IServiceCollection AddElm(this IServiceCollection services) + /// The to add services to. + public static void AddElm(this IServiceCollection services) { if (services == null) { throw new ArgumentNullException(nameof(services)); } - - services.AddSingleton(); - return services; + + services.AddOptions(); + services.TryAddSingleton(); + services.TryAddSingleton(); } /// - /// Configures a set of for the application. + /// Adds error logging middleware services to the specified . /// - /// The services available in the application. - /// The which need to be configured. - public static void ConfigureElm( - this IServiceCollection services, - Action configureOptions) + /// The to add services to. + /// An to configure the provided . + public static void AddElm(this IServiceCollection services, Action setupAction) { if (services == null) { throw new ArgumentNullException(nameof(services)); } - if (configureOptions == null) + if (setupAction == null) { - throw new ArgumentNullException(nameof(configureOptions)); + throw new ArgumentNullException(nameof(setupAction)); } - services.Configure(configureOptions); + services.AddElm(); + services.Configure(setupAction); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.MiddlewareAnalysis/AnalysisServiceCollectionExtensions.cs b/src/Microsoft.AspNetCore.MiddlewareAnalysis/AnalysisServiceCollectionExtensions.cs index 2bfeeaa41b..8c6188d7c8 100644 --- a/src/Microsoft.AspNetCore.MiddlewareAnalysis/AnalysisServiceCollectionExtensions.cs +++ b/src/Microsoft.AspNetCore.MiddlewareAnalysis/AnalysisServiceCollectionExtensions.cs @@ -1,17 +1,31 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.MiddlewareAnalysis; using Microsoft.Extensions.DependencyInjection.Extensions; namespace Microsoft.Extensions.DependencyInjection { + /// + /// Extension methods for setting up diagnostic services in an . + /// public static class AnalysisServiceCollectionExtensions { + /// + /// Adds diagnostic services to the specified . + /// + /// The to add services to. public static IServiceCollection AddMiddlewareAnalysis(this IServiceCollection services) { - // This should prevent AnalysisStartupFilter from being registered more than once. + if (services == null) + { + throw new ArgumentNullException(nameof(services)); + } + + // Prevent registering the same implementation of IStartupFilter (AnalysisStartupFilter) multiple times. + // But allow multiple registrations of different implementation types. services.TryAddEnumerable(ServiceDescriptor.Transient()); return services; } diff --git a/test/Microsoft.AspNetCore.Diagnostics.Tests/ElmLoggerTest.cs b/test/Microsoft.AspNetCore.Diagnostics.Tests/ElmLoggerTest.cs index e5d96ae4e3..cdd7c7e469 100644 --- a/test/Microsoft.AspNetCore.Diagnostics.Tests/ElmLoggerTest.cs +++ b/test/Microsoft.AspNetCore.Diagnostics.Tests/ElmLoggerTest.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Threading; using Microsoft.AspNetCore.Diagnostics.Elm; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Xunit; namespace Microsoft.AspNetCore.Diagnostics.Tests @@ -22,7 +23,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Tests // Arrange var store = new ElmStore(); var options = new ElmOptions() { Filter = filter ?? _filter }; - var provider = new ElmLoggerProvider(store, options); + var provider = new ElmLoggerProvider(store, Options.Create(options)); var logger = (ElmLogger)provider.CreateLogger(name ?? _name); return new Tuple(logger, store); diff --git a/test/Microsoft.AspNetCore.Diagnostics.Tests/ElmMiddlewareTest.cs b/test/Microsoft.AspNetCore.Diagnostics.Tests/ElmMiddlewareTest.cs index e7ee6c9950..5263909bfb 100644 --- a/test/Microsoft.AspNetCore.Diagnostics.Tests/ElmMiddlewareTest.cs +++ b/test/Microsoft.AspNetCore.Diagnostics.Tests/ElmMiddlewareTest.cs @@ -43,7 +43,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Tests optionsMock .SetupGet(o => o.Value) .Returns(new ElmOptions()); - factory.AddProvider(new ElmLoggerProvider(elmStore, optionsMock.Object.Value)); + factory.AddProvider(new ElmLoggerProvider(elmStore, optionsMock.Object)); RequestDelegate next = _ => { @@ -80,7 +80,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Tests optionsMock .SetupGet(o => o.Value) .Returns(new ElmOptions()); - factory.AddProvider(new ElmLoggerProvider(elmStore, optionsMock.Object.Value)); + factory.AddProvider(new ElmLoggerProvider(elmStore, optionsMock.Object)); RequestDelegate next = _ => { @@ -128,7 +128,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Tests optionsMock .SetupGet(o => o.Value) .Returns(new ElmOptions()); - factory.AddProvider(new ElmLoggerProvider(elmStore, optionsMock.Object.Value)); + factory.AddProvider(new ElmLoggerProvider(elmStore, optionsMock.Object)); RequestDelegate next = _ => { @@ -230,7 +230,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Tests // Arrange var context = new DefaultHttpContext(); var loggerFactory = new LoggerFactory(); - loggerFactory.AddProvider(new ElmLoggerProvider(new ElmStore(), new ElmOptions())); + loggerFactory.AddProvider(new ElmLoggerProvider(new ElmStore(), Options.Create(new ElmOptions()))); // Act & Assert var errorPageMiddleware = new ElmCaptureMiddleware((innerContext) => @@ -256,7 +256,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Tests }; context.Features.Set(requestIdentifierFeature); var loggerFactory = new LoggerFactory(); - loggerFactory.AddProvider(new ElmLoggerProvider(new ElmStore(), new ElmOptions())); + loggerFactory.AddProvider(new ElmLoggerProvider(new ElmStore(), Options.Create(new ElmOptions()))); var errorPageMiddleware = new ElmCaptureMiddleware((innerContext) => { @@ -278,7 +278,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Tests var requestIdentifierFeature = new HttpRequestIdentifierFeature() { TraceIdentifier = requestId }; context.Features.Set(requestIdentifierFeature); var loggerFactory = new LoggerFactory(); - loggerFactory.AddProvider(new ElmLoggerProvider(new ElmStore(), new ElmOptions())); + loggerFactory.AddProvider(new ElmLoggerProvider(new ElmStore(), Options.Create(new ElmOptions()))); var errorPageMiddleware = new ElmCaptureMiddleware((innerContext) => {