diff --git a/src/Orchard.Web/Packages/Orchard.Setup/Controllers/SetupController.cs b/src/Orchard.Web/Packages/Orchard.Setup/Controllers/SetupController.cs index d277edca5..c00a06b56 100644 --- a/src/Orchard.Web/Packages/Orchard.Setup/Controllers/SetupController.cs +++ b/src/Orchard.Web/Packages/Orchard.Setup/Controllers/SetupController.cs @@ -1,4 +1,8 @@ using System.Web.Mvc; +using Orchard.ContentManagement; +using Orchard.Data.Migrations; +using Orchard.Environment; +using Orchard.Environment.Configuration; using Orchard.Setup.ViewModels; using Orchard.Localization; using Orchard.UI.Notify; @@ -6,9 +10,16 @@ using Orchard.UI.Notify; namespace Orchard.Setup.Controllers { public class SetupController : Controller { private readonly INotifier _notifier; + private readonly IDatabaseMigrationManager _databaseMigrationManager; + private readonly IOrchardHost _orchardHost; - public SetupController(INotifier notifier) { + public SetupController( + INotifier notifier, + IDatabaseMigrationManager databaseMigrationManager, + IOrchardHost orchardHost) { _notifier = notifier; + _databaseMigrationManager = databaseMigrationManager; + _orchardHost = orchardHost; T = NullLocalizer.Instance; } @@ -25,11 +36,28 @@ namespace Orchard.Setup.Controllers { if (!ModelState.IsValid) { return View(model); } + + //notes: service call to initialize database: + //_databaseMigrationManager.CreateCoordinator(provider, dataFolder, connectionString); + // provider: SqlServer or SQLite + // dataFolder: physical path (map before calling). Builtin database will be created in this location + // connectionString: optional - if provided the dataFolder is essentially ignored, but should still be passed in + - // create superuser - // set site name - // database - // redirect to the welcome page + //notes: the other tool needed will be creating a standalone environment. + // in theory this environment can be used to resolve any normal components by interface, and those + // components will exist entirely in isolation - no crossover between the safemode container currently in effect + var shellSettings = new ShellSettings { Name = "temp" }; + using (var finiteEnvironment = _orchardHost.CreateStandaloneEnvironment(shellSettings)) { + var contentManager = finiteEnvironment.Resolve(); + var yadda = contentManager.Create("yadda"); + + // create superuser + // set site name + // database + // redirect to the welcome page + } + _notifier.Information(T("Setup succeeded")); return RedirectToAction("Index"); diff --git a/src/Orchard/Environment/DefaultOrchardHost.cs b/src/Orchard/Environment/DefaultOrchardHost.cs index 3e6a8a733..2400fa3cc 100644 --- a/src/Orchard/Environment/DefaultOrchardHost.cs +++ b/src/Orchard/Environment/DefaultOrchardHost.cs @@ -38,10 +38,16 @@ namespace Orchard.Environment { void IOrchardHost.Initialize() { Initialize(); } + void IOrchardHost.EndRequest() { EndRequest(); } + IStandaloneEnvironment IOrchardHost.CreateStandaloneEnvironment(IShellSettings shellSettings) { + var shellContainer = CreateShellContainer(shellSettings); + return new StandaloneEnvironment(shellContainer); + } + protected virtual void Initialize() { var shellContainer = CreateShellContainer(); var shell = shellContainer.Resolve(); @@ -73,18 +79,18 @@ namespace Orchard.Environment { var settings = _shellSettingsLoader.LoadSettings(); if (settings.Any()) { //TEMP: multi-tenancy not implemented yet - foreach (var factory in _shellContainerFactories) { - var container = factory.CreateContainer(settings.Single()); - if (container != null) - return container; - } + var shellContainer = CreateShellContainer(settings.Single()); + if (shellContainer != null) + return shellContainer; } - else { - foreach (var factory in _shellContainerFactories) { - var container = factory.CreateContainer(null); - if (container != null) - return container; - } + return CreateShellContainer(null); + } + + private IContainer CreateShellContainer(IShellSettings shellSettings) { + foreach (var factory in _shellContainerFactories) { + var container = factory.CreateContainer(shellSettings); + if (container != null) + return container; } return null; } @@ -118,5 +124,6 @@ namespace Orchard.Environment { } } + } } \ No newline at end of file diff --git a/src/Orchard/Environment/FiniteContainerProvider.cs b/src/Orchard/Environment/FiniteContainerProvider.cs index 9fd6274f8..58fd440ba 100644 --- a/src/Orchard/Environment/FiniteContainerProvider.cs +++ b/src/Orchard/Environment/FiniteContainerProvider.cs @@ -2,6 +2,7 @@ using Autofac; using Autofac.Integration.Web; namespace Orchard.Environment { + class FiniteContainerProvider : IContainerProvider { public FiniteContainerProvider(IContainer applicationContainer) { // explicitly create a request container for the life of this object diff --git a/src/Orchard/Environment/IOrchardHost.cs b/src/Orchard/Environment/IOrchardHost.cs index b68eaa665..ffb1706cf 100644 --- a/src/Orchard/Environment/IOrchardHost.cs +++ b/src/Orchard/Environment/IOrchardHost.cs @@ -1,6 +1,10 @@ +using Orchard.Environment.Configuration; + namespace Orchard.Environment { public interface IOrchardHost { void Initialize(); void EndRequest(); + + IStandaloneEnvironment CreateStandaloneEnvironment(IShellSettings shellSettings); } -} \ No newline at end of file +} diff --git a/src/Orchard/Environment/ShellBuilders/SafeModeShellContainerFactory.cs b/src/Orchard/Environment/ShellBuilders/SafeModeShellContainerFactory.cs index 51735d9df..f8e5cc9ff 100644 --- a/src/Orchard/Environment/ShellBuilders/SafeModeShellContainerFactory.cs +++ b/src/Orchard/Environment/ShellBuilders/SafeModeShellContainerFactory.cs @@ -5,6 +5,7 @@ using System.Web.Routing; using Autofac; using Orchard.ContentManagement; using Orchard.ContentManagement.Handlers; +using Orchard.Data.Migrations; using Orchard.Environment.Configuration; using Orchard.Extensions; using Orchard.Localization; @@ -37,7 +38,6 @@ namespace Orchard.Environment.ShellBuilders { var shellContainer = _container.CreateInnerContainer(); shellContainer.Build(builder => { - //review: group by default vs safemode service replacements // standard services needed in safe mode builder.Register().As().ContainerScoped(); builder.Register().As().ContainerScoped(); @@ -50,6 +50,7 @@ namespace Orchard.Environment.ShellBuilders { builder.Register().As().ContainerScoped(); builder.Register().As().ContainerScoped(); builder.Register().As().ContainerScoped(); + builder.Register().As().ContainerScoped(); // safe mode specific implementations of needed service interfaces builder.Register().As().ContainerScoped(); diff --git a/src/Orchard/Environment/StandaloneEnvironment.cs b/src/Orchard/Environment/StandaloneEnvironment.cs new file mode 100644 index 000000000..28a1379a2 --- /dev/null +++ b/src/Orchard/Environment/StandaloneEnvironment.cs @@ -0,0 +1,25 @@ +using System; +using Autofac; +using Autofac.Integration.Web; + +namespace Orchard.Environment { + public interface IStandaloneEnvironment : IDisposable { + TService Resolve(); + } + + public class StandaloneEnvironment : IStandaloneEnvironment { + private readonly IContainerProvider _containerProvider; + + public StandaloneEnvironment(IContainer applicationContainer) { + _containerProvider = new FiniteContainerProvider(applicationContainer); + } + + public TService Resolve() { + return _containerProvider.RequestContainer.Resolve(); + } + + public void Dispose() { + _containerProvider.DisposeRequestContainer(); + } + } +} \ No newline at end of file diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj index 579299497..c272652ab 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -145,6 +145,7 @@ + diff --git a/src/Orchard/Tasks/SweepGenerator.cs b/src/Orchard/Tasks/SweepGenerator.cs index 1326f05c9..6612f4181 100644 --- a/src/Orchard/Tasks/SweepGenerator.cs +++ b/src/Orchard/Tasks/SweepGenerator.cs @@ -56,18 +56,11 @@ namespace Orchard.Tasks { public void DoWork() { // makes an inner container, similar to the per-request container - var containerProvider = new FiniteContainerProvider(_container); - try { - var requestContainer = containerProvider.RequestContainer; - + using (var standaloneEnvironment = new StandaloneEnvironment(_container)) { // resolve the manager and invoke it - var manager = requestContainer.Resolve(); + var manager = standaloneEnvironment.Resolve(); manager.Sweep(); } - finally{ - // shut everything down again - containerProvider.DisposeRequestContainer(); - } } }