From 9b061ececba620784a0fb54eb4bd3bf33509393e Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 16 Sep 2015 14:52:54 -0700 Subject: [PATCH] Dispose the service provider on app shutdown - Added a unit test #322 --- .../Internal/Application.cs | 1 + .../Fakes/FakeService.cs | 12 ++++++++- .../HostingEngineTests.cs | 27 +++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/Application.cs b/src/Microsoft.AspNet.Hosting/Internal/Application.cs index ecbb916a6e..0603b48628 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/Application.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/Application.cs @@ -32,6 +32,7 @@ namespace Microsoft.AspNet.Hosting.Internal public void Dispose() { _stop.Dispose(); + (_services as IDisposable)?.Dispose(); } } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs index 75176f8928..8f90f3899b 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs @@ -1,7 +1,17 @@ // 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; + namespace Microsoft.AspNet.Hosting.Fakes { - public class FakeService : IFakeEveryService { } + public class FakeService : IFakeEveryService, IDisposable + { + public bool Disposed { get; private set; } + + public void Dispose() + { + Disposed = true; + } + } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 1ded347dbb..b831277232 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting.Fakes; using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; @@ -92,6 +93,32 @@ namespace Microsoft.AspNet.Hosting Assert.Equal(1, _startInstances[0].DisposeCalls); } + [Fact] + public void HostingEngineDisposesServiceProvider() + { + var engine = CreateBuilder() + .UseServer(this) + .UseServices(s => + { + s.AddTransient(); + s.AddSingleton(); + }) + .UseStartup("Microsoft.AspNet.Hosting.Tests") + .Build() + .Start(); + + var singleton = (FakeService)engine.Services.GetService(); + var transient = (FakeService)engine.Services.GetService(); + + Assert.False(singleton.Disposed); + Assert.False(transient.Disposed); + + engine.Dispose(); + + Assert.True(singleton.Disposed); + Assert.True(transient.Disposed); + } + [Fact] public void HostingEngineNotifiesApplicationStarted() {