diff --git a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs index 892eaab372..a714c2cfef 100644 --- a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Hosting public void Configure(IHostingEnvironment hostingEnv) { - hostingEnv.EnvironmentName = _config?.Get(EnvironmentKey) ?? hostingEnv.EnvironmentName; + hostingEnv.EnvironmentName = _config.Get(EnvironmentKey) ?? hostingEnv.EnvironmentName; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 926812c408..46b0f94703 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -14,61 +14,39 @@ namespace Microsoft.AspNet.Hosting { public static class HostingServices { - private static IServiceCollection Import(IServiceProvider fallbackProvider, Action configureHostServices) + private static IServiceCollection Import(IServiceProvider fallbackProvider) { var services = new ServiceCollection(); - if (configureHostServices != null) - { - configureHostServices(services); - } var manifest = fallbackProvider.GetRequiredService(); foreach (var service in manifest.Services) { services.AddTransient(service, sp => fallbackProvider.GetService(service)); } - services.AddSingleton(sp => new HostingManifest(services)); return services; } - public static IServiceCollection Create() + public static IServiceCollection Create(IConfiguration configuration = null) { - return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices: null, configuration: null); + return Create(CallContextServiceLocator.Locator.ServiceProvider, configuration); } - public static IServiceCollection Create(IServiceProvider fallbackServices) + public static IServiceCollection Create(IServiceProvider fallbackServices, IConfiguration configuration = null) { - return Create(fallbackServices, configureHostServices: null, configuration: null); - } - - public static IServiceCollection Create(IServiceProvider fallbackServices, Action configureHostServices) - { - return Create(fallbackServices, configureHostServices, configuration: null); - } - - public static IServiceCollection Create(Action configureHostServices, IConfiguration configuration) - { - return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices, configuration); - } - - public static IServiceCollection Create(IServiceProvider fallbackServices, IConfiguration configuration) - { - return Create(fallbackServices, configureHostServices: null, configuration: configuration); - } - - public static IServiceCollection Create(IServiceProvider fallbackServices, Action configureHostServices, IConfiguration configuration) - { - var services = Import(fallbackServices, configureHostServices); + configuration = configuration ?? new Configuration(); + var services = Import(fallbackServices); services.AddHosting(configuration); + services.AddSingleton(sp => new HostingManifest(fallbackServices)); return services; } // Manifest exposes the fallback manifest in addition to ITypeActivator, IHostingEnvironment, and ILoggerFactory private class HostingManifest : IServiceManifest { - public HostingManifest(IServiceCollection hostServices) + public HostingManifest(IServiceProvider fallback) { - Services = new Type[] { typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory), typeof(ILogger<>), typeof(IHttpContextAccessor) } - .Concat(hostServices.Select(s => s.ServiceType)).Distinct(); + var manifest = fallback.GetRequiredService(); + Services = new Type[] { typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory), typeof(IHttpContextAccessor) } + .Concat(manifest.Services).Distinct(); } public IEnumerable Services { get; private set; } diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs index f6a73158a7..8c52a6910d 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -12,13 +12,8 @@ namespace Microsoft.Framework.DependencyInjection { public static class HostingServicesExtensions { - public static IServiceCollection AddLogging(this IServiceCollection services) - { - return services.AddLogging(config: null); - } - // REVIEW: Logging doesn't depend on DI, where should this live? - public static IServiceCollection AddLogging(this IServiceCollection services, IConfiguration config) + public static IServiceCollection AddLogging(this IServiceCollection services, IConfiguration config = null) { var describe = new ServiceDescriber(config); services.TryAdd(describe.Singleton()); @@ -26,12 +21,7 @@ namespace Microsoft.Framework.DependencyInjection return services; } - public static IServiceCollection AddHosting(this IServiceCollection services) - { - return services.AddHosting(configuration: null); - } - - public static IServiceCollection AddHosting(this IServiceCollection services, IConfiguration configuration) + public static IServiceCollection AddHosting(this IServiceCollection services, IConfiguration configuration = null) { var describer = new ServiceDescriber(configuration); diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index a5496170d1..54b908133e 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -2,7 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; +using System.Linq; using System.Net.Http; +using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; @@ -46,22 +49,12 @@ namespace Microsoft.AspNet.TestHost public static TestServer Create(Action app) { - return Create(CallContextServiceLocator.Locator.ServiceProvider, app, configureHostServices: null); - } - - public static TestServer Create(Action app, Action configureHostServices) - { - return Create(CallContextServiceLocator.Locator.ServiceProvider, app, configureHostServices); + return Create(CallContextServiceLocator.Locator.ServiceProvider, app); } public static TestServer Create(IServiceProvider serviceProvider, Action app) { - return Create(serviceProvider, app, configureHostServices: null); - } - - public static TestServer Create(IServiceProvider serviceProvider, Action app, Action configureHostServices) - { - var appServices = HostingServices.Create(serviceProvider, configureHostServices).BuildServiceProvider(); + var appServices = HostingServices.Create(serviceProvider).BuildServiceProvider(); var config = new Configuration(); return new TestServer(config, appServices, app); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs index 8cafaa90c6..5e6e733da8 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs @@ -53,73 +53,6 @@ namespace Microsoft.AspNet.Hosting.Tests Assert.Null(provider.GetService()); // Make sure we don't leak non manifest services } - [Fact] - public void CreateCanAddAdditionalServices() - { - // Arrange - var fallbackServices = new ServiceCollection(); - fallbackServices.AddTransient(); - fallbackServices.AddTransient(); // Don't register in manifest - - fallbackServices.AddInstance(new ServiceManifest( - new Type[] { - typeof(IFakeService), - })); - - var instance = new FakeService(); - var factoryInstance = new FakeFactoryService(instance); - - var services = HostingServices.Create(fallbackServices.BuildServiceProvider(), - additionalHostServices => - { - additionalHostServices.AddSingleton(); - additionalHostServices.AddInstance(instance); - additionalHostServices.AddSingleton(serviceProvider => factoryInstance); - }); - - // Act - var provider = services.BuildServiceProvider(); - var singleton = provider.GetRequiredService(); - var transient = provider.GetRequiredService(); - var factory = provider.GetRequiredService(); - var manifest = provider.GetRequiredService(); - - // Assert - Assert.Same(singleton, provider.GetRequiredService()); - Assert.NotSame(transient, provider.GetRequiredService()); - Assert.Same(instance, provider.GetRequiredService()); - Assert.Same(factoryInstance, factory); - Assert.Same(factory.FakeService, instance); - Assert.Null(provider.GetService()); - Assert.Null(provider.GetService()); // Make sure we don't leak non manifest services - Assert.Contains(typeof(IFakeSingletonService), manifest.Services); - Assert.Contains(typeof(IFakeServiceInstance), manifest.Services); - Assert.Contains(typeof(IFactoryService), manifest.Services); - } - - [Fact] - public void CreateAdditionalServicesDoNotOverrideFallback() - { - // Arrange - var fallbackServices = new ServiceCollection(); - fallbackServices.AddTransient(); - - fallbackServices.AddInstance(new ServiceManifest( - new Type[] { - typeof(IFakeService), - })); - - var services = HostingServices.Create(fallbackServices.BuildServiceProvider(), - additionalHostServices => additionalHostServices.AddSingleton()); - - // Act - var provider = services.BuildServiceProvider(); - var stillTransient = provider.GetRequiredService(); - - // Assert - Assert.NotSame(stillTransient, provider.GetRequiredService()); - } - [Fact] public void CanHideImportedServices() { diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs index 74027b51fc..e247d4ec64 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs @@ -93,7 +93,6 @@ namespace Microsoft.AspNet.Hosting.Tests [InlineData(typeof(IApplicationLifetime))] [InlineData(typeof(ILoggerFactory))] [InlineData(typeof(IHttpContextAccessor))] - [InlineData(typeof(ILogger))] public void UseRequestServicesHostingImportedServicesAreDefined(Type service) { var baseServiceProvider = HostingServices.Create().BuildServiceProvider(); diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 57d4ed290e..0a31db1b21 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -40,6 +40,7 @@ namespace Microsoft.AspNet.TestHost [Fact] public async Task CanAccessHttpContext() { + var services = new ServiceCollection().BuildServiceProvider(); TestServer server = TestServer.Create(app => { app.Run(context => @@ -53,35 +54,6 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("HasContext:True", result); } - public class ContextHolder - { - public ContextHolder(IHttpContextAccessor accessor) - { - Accessor = accessor; - } - - public IHttpContextAccessor Accessor { get; set; } - } - - [Fact] - public async Task CanAddNewHostServices() - { - TestServer server = TestServer.Create(app => - { - var a = app.ApplicationServices.GetRequiredService(); - - app.Run(context => - { - var b = app.ApplicationServices.GetRequiredService(); - var accessor = app.ApplicationServices.GetRequiredService(); - return context.Response.WriteAsync("HasContext:" + (accessor.Accessor.Value != null)); - }); - }, newHostServices => newHostServices.AddSingleton()); - - string result = await server.CreateClient().GetStringAsync("/path"); - Assert.Equal("HasContext:True", result); - } - [Fact] public async Task CreateInvokesApp() {