Make ServiceCollectionExtensions consistent
This commit is contained in:
parent
73a9ed7a64
commit
38b727948b
|
|
@ -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;
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -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>();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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) =>
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue