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)
{
services.AddElm();
services.ConfigureElm(elmOptions =>
services.AddElm(elmOptions =>
{
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
var factory = app.ApplicationServices.GetRequiredService<ILoggerFactory>();
var store = app.ApplicationServices.GetRequiredService<ElmStore>();
var options = app.ApplicationServices.GetService<IOptions<ElmOptions>>();
factory.AddProvider(new ElmLoggerProvider(store, options?.Value ?? new ElmOptions()));
var provider = app.ApplicationServices.GetRequiredService<ElmLoggerProvider>();
factory.AddProvider(provider);
return app.UseMiddleware<ElmCaptureMiddleware>();
}

View File

@ -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<ElmOptions> 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)

View File

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

View File

@ -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
{
/// <summary>
/// Extension methods for setting up diagnostic services in an <see cref="IServiceCollection" />.
/// </summary>
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)
{
// 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>());
return services;
}

View File

@ -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<ElmLogger, ElmStore>(logger, store);

View File

@ -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<IHttpRequestIdentifierFeature>(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<IHttpRequestIdentifierFeature>(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) =>
{