Make ServiceCollectionExtensions consistent

This commit is contained in:
jacalvar 2016-02-24 23:29:44 -08:00
parent 73a9ed7a64
commit 38b727948b
7 changed files with 48 additions and 30 deletions

View File

@ -12,9 +12,7 @@ namespace ElmPageSample
{ {
public void ConfigureServices(IServiceCollection services) public void ConfigureServices(IServiceCollection services)
{ {
services.AddElm(); services.AddElm(elmOptions =>
services.ConfigureElm(elmOptions =>
{ {
elmOptions.Filter = (loggerName, loglevel) => loglevel == LogLevel.Debug; elmOptions.Filter = (loggerName, loglevel) => loglevel == LogLevel.Debug;
}); });

View File

@ -23,9 +23,8 @@ namespace Microsoft.AspNetCore.Builder
// add the elm provider to the factory here so the logger can start capturing logs immediately // add the elm provider to the factory here so the logger can start capturing logs immediately
var factory = app.ApplicationServices.GetRequiredService<ILoggerFactory>(); var factory = app.ApplicationServices.GetRequiredService<ILoggerFactory>();
var store = app.ApplicationServices.GetRequiredService<ElmStore>(); var provider = app.ApplicationServices.GetRequiredService<ElmLoggerProvider>();
var options = app.ApplicationServices.GetService<IOptions<ElmOptions>>(); factory.AddProvider(provider);
factory.AddProvider(new ElmLoggerProvider(store, options?.Value ?? new ElmOptions()));
return app.UseMiddleware<ElmCaptureMiddleware>(); return app.UseMiddleware<ElmCaptureMiddleware>();
} }

View File

@ -3,6 +3,7 @@
using System; using System;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Diagnostics.Elm namespace Microsoft.AspNetCore.Diagnostics.Elm
{ {
@ -11,7 +12,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Elm
private readonly ElmStore _store; private readonly ElmStore _store;
private readonly ElmOptions _options; private readonly ElmOptions _options;
public ElmLoggerProvider(ElmStore store, ElmOptions options) public ElmLoggerProvider(ElmStore store, IOptions<ElmOptions> options)
{ {
if (store == null) if (store == null)
{ {
@ -24,7 +25,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Elm
} }
_store = store; _store = store;
_options = options; _options = options.Value;
} }
public ILogger CreateLogger(string name) public ILogger CreateLogger(string name)

View File

@ -3,45 +3,50 @@
using System; using System;
using Microsoft.AspNetCore.Diagnostics.Elm; using Microsoft.AspNetCore.Diagnostics.Elm;
using Microsoft.Extensions.DependencyInjection.Extensions;
namespace Microsoft.Extensions.DependencyInjection namespace Microsoft.Extensions.DependencyInjection
{ {
/// <summary>
/// Extension methods for setting up Elm services in an <see cref="IServiceCollection" />.
/// </summary>
public static class ElmServiceCollectionExtensions public static class ElmServiceCollectionExtensions
{ {
/// <summary> /// <summary>
/// Registers an <see cref="ElmStore"/> and configures default <see cref="ElmOptions"/>. /// Adds error logging middleware services to the specified <see cref="IServiceCollection" />.
/// </summary> /// </summary>
public static IServiceCollection AddElm(this IServiceCollection services) /// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
public static void AddElm(this IServiceCollection services)
{ {
if (services == null) if (services == null)
{ {
throw new ArgumentNullException(nameof(services)); throw new ArgumentNullException(nameof(services));
} }
services.AddSingleton<ElmStore>(); services.AddOptions();
return services; services.TryAddSingleton<ElmStore>();
services.TryAddSingleton<ElmLoggerProvider>();
} }
/// <summary> /// <summary>
/// Configures a set of <see cref="ElmOptions"/> for the application. /// Adds error logging middleware services to the specified <see cref="IServiceCollection" />.
/// </summary> /// </summary>
/// <param name="services">The services available in the application.</param> /// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <param name="configureOptions">The <see cref="ElmOptions"/> which need to be configured.</param> /// <param name="setupAction">An <see cref="Action{ElmOptions}"/> to configure the provided <see cref="ElmOptions"/>.</param>
public static void ConfigureElm( public static void AddElm(this IServiceCollection services, Action<ElmOptions> setupAction)
this IServiceCollection services,
Action<ElmOptions> configureOptions)
{ {
if (services == null) if (services == null)
{ {
throw new ArgumentNullException(nameof(services)); 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);
} }
} }
} }

View File

@ -1,17 +1,31 @@
// Copyright (c) .NET Foundation. All rights reserved. // 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. // 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.Hosting;
using Microsoft.AspNetCore.MiddlewareAnalysis; using Microsoft.AspNetCore.MiddlewareAnalysis;
using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.DependencyInjection.Extensions;
namespace Microsoft.Extensions.DependencyInjection namespace Microsoft.Extensions.DependencyInjection
{ {
/// <summary>
/// Extension methods for setting up diagnostic services in an <see cref="IServiceCollection" />.
/// </summary>
public static class AnalysisServiceCollectionExtensions public static class AnalysisServiceCollectionExtensions
{ {
/// <summary>
/// Adds diagnostic services to the specified <see cref="IServiceCollection" />.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
public static IServiceCollection AddMiddlewareAnalysis(this IServiceCollection services) 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<IStartupFilter, AnalysisStartupFilter>()); services.TryAddEnumerable(ServiceDescriptor.Transient<IStartupFilter, AnalysisStartupFilter>());
return services; return services;
} }

View File

@ -7,6 +7,7 @@ using System.Linq;
using System.Threading; using System.Threading;
using Microsoft.AspNetCore.Diagnostics.Elm; using Microsoft.AspNetCore.Diagnostics.Elm;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.Diagnostics.Tests namespace Microsoft.AspNetCore.Diagnostics.Tests
@ -22,7 +23,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Tests
// Arrange // Arrange
var store = new ElmStore(); var store = new ElmStore();
var options = new ElmOptions() { Filter = filter ?? _filter }; 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); var logger = (ElmLogger)provider.CreateLogger(name ?? _name);
return new Tuple<ElmLogger, ElmStore>(logger, store); return new Tuple<ElmLogger, ElmStore>(logger, store);

View File

@ -43,7 +43,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Tests
optionsMock optionsMock
.SetupGet(o => o.Value) .SetupGet(o => o.Value)
.Returns(new ElmOptions()); .Returns(new ElmOptions());
factory.AddProvider(new ElmLoggerProvider(elmStore, optionsMock.Object.Value)); factory.AddProvider(new ElmLoggerProvider(elmStore, optionsMock.Object));
RequestDelegate next = _ => RequestDelegate next = _ =>
{ {
@ -80,7 +80,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Tests
optionsMock optionsMock
.SetupGet(o => o.Value) .SetupGet(o => o.Value)
.Returns(new ElmOptions()); .Returns(new ElmOptions());
factory.AddProvider(new ElmLoggerProvider(elmStore, optionsMock.Object.Value)); factory.AddProvider(new ElmLoggerProvider(elmStore, optionsMock.Object));
RequestDelegate next = _ => RequestDelegate next = _ =>
{ {
@ -128,7 +128,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Tests
optionsMock optionsMock
.SetupGet(o => o.Value) .SetupGet(o => o.Value)
.Returns(new ElmOptions()); .Returns(new ElmOptions());
factory.AddProvider(new ElmLoggerProvider(elmStore, optionsMock.Object.Value)); factory.AddProvider(new ElmLoggerProvider(elmStore, optionsMock.Object));
RequestDelegate next = _ => RequestDelegate next = _ =>
{ {
@ -230,7 +230,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Tests
// Arrange // Arrange
var context = new DefaultHttpContext(); var context = new DefaultHttpContext();
var loggerFactory = new LoggerFactory(); var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new ElmLoggerProvider(new ElmStore(), new ElmOptions())); loggerFactory.AddProvider(new ElmLoggerProvider(new ElmStore(), Options.Create(new ElmOptions())));
// Act & Assert // Act & Assert
var errorPageMiddleware = new ElmCaptureMiddleware((innerContext) => var errorPageMiddleware = new ElmCaptureMiddleware((innerContext) =>
@ -256,7 +256,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Tests
}; };
context.Features.Set<IHttpRequestIdentifierFeature>(requestIdentifierFeature); context.Features.Set<IHttpRequestIdentifierFeature>(requestIdentifierFeature);
var loggerFactory = new LoggerFactory(); 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) => var errorPageMiddleware = new ElmCaptureMiddleware((innerContext) =>
{ {
@ -278,7 +278,7 @@ namespace Microsoft.AspNetCore.Diagnostics.Tests
var requestIdentifierFeature = new HttpRequestIdentifierFeature() { TraceIdentifier = requestId }; var requestIdentifierFeature = new HttpRequestIdentifierFeature() { TraceIdentifier = requestId };
context.Features.Set<IHttpRequestIdentifierFeature>(requestIdentifierFeature); context.Features.Set<IHttpRequestIdentifierFeature>(requestIdentifierFeature);
var loggerFactory = new LoggerFactory(); 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) => var errorPageMiddleware = new ElmCaptureMiddleware((innerContext) =>
{ {