diff --git a/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs b/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs index 15d7277e0..47f973981 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs +++ b/src/Orchard.Web/Modules/Orchard.Setup/Services/SetupService.cs @@ -109,38 +109,44 @@ namespace Orchard.Setup.Services { var shellBlueprint = _compositionStrategy.Compose(shellSettings, shellDescriptor); // initialize database explicitly, and store shell descriptor - var bootstrapLifetimeScope = _shellContainerFactory.CreateContainer(shellSettings, shellBlueprint); + using (var bootstrapLifetimeScope = _shellContainerFactory.CreateContainer(shellSettings, shellBlueprint)) + { - using (var environment = bootstrapLifetimeScope.CreateWorkContextScope()) { + using (var environment = bootstrapLifetimeScope.CreateWorkContextScope()) + { - // check if the database is already created (in case an exception occured in the second phase) - var shellDescriptorRepository = environment.Resolve>(); - try { - shellDescriptorRepository.Get(x => true); - } - catch { - var schemaBuilder = new SchemaBuilder(environment.Resolve()); - var reportsCoordinator = environment.Resolve(); - - reportsCoordinator.Register("Data Migration", "Setup", "Orchard installation"); - - schemaBuilder.CreateTable("Orchard_Framework_DataMigrationRecord", - table => table - .Column("Id", column => column.PrimaryKey().Identity()) - .Column("DataMigrationClass") - .Column("Version")); - - var dataMigrationManager = environment.Resolve(); - dataMigrationManager.Update("Settings"); - - foreach (var feature in context.EnabledFeatures) { - dataMigrationManager.Update(feature); + // check if the database is already created (in case an exception occured in the second phase) + var shellDescriptorRepository = environment.Resolve>(); + try + { + shellDescriptorRepository.Get(x => true); } + catch + { + var schemaBuilder = new SchemaBuilder(environment.Resolve()); + var reportsCoordinator = environment.Resolve(); - environment.Resolve().UpdateShellDescriptor( - 0, - shellDescriptor.Features, - shellDescriptor.Parameters); + reportsCoordinator.Register("Data Migration", "Setup", "Orchard installation"); + + schemaBuilder.CreateTable("Orchard_Framework_DataMigrationRecord", + table => table + .Column("Id", column => column.PrimaryKey().Identity()) + .Column("DataMigrationClass") + .Column("Version")); + + var dataMigrationManager = environment.Resolve(); + dataMigrationManager.Update("Settings"); + + foreach (var feature in context.EnabledFeatures) + { + dataMigrationManager.Update(feature); + } + + environment.Resolve().UpdateShellDescriptor( + 0, + shellDescriptor.Features, + shellDescriptor.Parameters); + } } } diff --git a/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs b/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs index f4653e94b..ff209273a 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs +++ b/src/Orchard.Web/Modules/Orchard.Setup/SetupMode.cs @@ -65,6 +65,7 @@ namespace Orchard.Setup { builder.RegisterType().As().InstancePerMatchingLifetimeScope("shell"); builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().InstancePerMatchingLifetimeScope("shell"); // setup mode specific implementations of needed service interfaces builder.RegisterType().As().InstancePerLifetimeScope(); @@ -77,7 +78,7 @@ namespace Orchard.Setup { builder.RegisterType().As().InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().As().SingleInstance(); // in progress - adding services for display/shape support in setup builder.RegisterType().As(); diff --git a/src/Orchard/Environment/DefaultOrchardHost.cs b/src/Orchard/Environment/DefaultOrchardHost.cs index bf4be43dd..00f3d2f31 100644 --- a/src/Orchard/Environment/DefaultOrchardHost.cs +++ b/src/Orchard/Environment/DefaultOrchardHost.cs @@ -167,6 +167,7 @@ namespace Orchard.Environment { if (_current != null) { foreach (var shellContext in _current) { shellContext.Shell.Terminate(); + shellContext.LifetimeScope.Dispose(); } _current = null; } diff --git a/src/Orchard/Environment/ShellBuilders/ShellContextFactory.cs b/src/Orchard/Environment/ShellBuilders/ShellContextFactory.cs index 47edf7161..a3a51107e 100644 --- a/src/Orchard/Environment/ShellBuilders/ShellContextFactory.cs +++ b/src/Orchard/Environment/ShellBuilders/ShellContextFactory.cs @@ -71,6 +71,7 @@ namespace Orchard.Environment.ShellBuilders { _shellDescriptorCache.Store(settings.Name, currentDescriptor); blueprint = _compositionStrategy.Compose(settings, currentDescriptor); + shellScope.Dispose(); shellScope = _shellContainerFactory.CreateContainer(settings, blueprint); } diff --git a/src/Orchard/Tasks/SweepGenerator.cs b/src/Orchard/Tasks/SweepGenerator.cs index 54be282f4..a48d568ef 100644 --- a/src/Orchard/Tasks/SweepGenerator.cs +++ b/src/Orchard/Tasks/SweepGenerator.cs @@ -5,7 +5,7 @@ using Orchard.Environment; using Orchard.Logging; namespace Orchard.Tasks { - public class SweepGenerator : IOrchardShellEvents { + public class SweepGenerator : IOrchardShellEvents, IDisposable { private readonly IWorkContextAccessor _workContextAccessor; private readonly Timer _timer; @@ -74,5 +74,10 @@ namespace Orchard.Tasks { } } + public void Dispose() + { + _timer.Elapsed -= Elapsed; + _timer.Dispose(); + } } }