From 91a34a35ffddb4ec5370c069bdcd92c2b4aad7e5 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 15 Feb 2010 12:54:27 -0800 Subject: [PATCH] Refactoring database session builder Reducing the implementation to what's needed at the moment Making the individual providers an implementation detail --HG-- branch : dev --- .../Data/Migrations/DatabaseManagerTests.cs | 32 ++++++++----------- src/Orchard.Tests/DataUtility.cs | 2 +- ...onFactoryBuilder.cs => AbstractBuilder.cs} | 6 ++-- .../Data/Migrations/DatabaseManager.cs | 11 ------- .../Data/Migrations/IDatabaseManager.cs | 12 ------- .../Data/Migrations/ISessionFactoryBuilder.cs | 12 ++++--- ...sionFactoryBuilder.cs => SQLiteBuilder.cs} | 4 +-- .../Data/Migrations/SessionFactoryBuilder.cs | 17 ++++++++++ ...nFactoryBuilder.cs => SqlServerBuilder.cs} | 4 +-- src/Orchard/Data/SessionFactoryHolder.cs | 19 ++++------- .../SafeModeShellContainerFactory.cs | 2 +- src/Orchard/Orchard.csproj | 9 +++--- 12 files changed, 58 insertions(+), 72 deletions(-) rename src/Orchard/Data/Migrations/{AbstractSessionFactoryBuilder.cs => AbstractBuilder.cs} (89%) delete mode 100644 src/Orchard/Data/Migrations/DatabaseManager.cs delete mode 100644 src/Orchard/Data/Migrations/IDatabaseManager.cs rename src/Orchard/Data/Migrations/{SQLiteSessionFactoryBuilder.cs => SQLiteBuilder.cs} (81%) create mode 100644 src/Orchard/Data/Migrations/SessionFactoryBuilder.cs rename src/Orchard/Data/Migrations/{SqlServerSessionFactoryBuilder.cs => SqlServerBuilder.cs} (77%) diff --git a/src/Orchard.Tests/Data/Migrations/DatabaseManagerTests.cs b/src/Orchard.Tests/Data/Migrations/DatabaseManagerTests.cs index 2e1207841..5e19fdbd1 100644 --- a/src/Orchard.Tests/Data/Migrations/DatabaseManagerTests.cs +++ b/src/Orchard.Tests/Data/Migrations/DatabaseManagerTests.cs @@ -47,17 +47,13 @@ namespace Orchard.Tests.Data.Migrations { [Test] public void SQLiteSchemaShouldBeGeneratedAndUsable() { - var manager = (IDatabaseManager)new DatabaseManager(); - var coordinator = manager.CreateCoordinator(new DatabaseParameters { - Provider = "SQLite", - DataFolder = _tempDataFolder - }); - - var recordDescriptors = new[] { + var recordDescriptors = new[] { new RecordDescriptor {Prefix = "Hello", Type = typeof (Foo)} }; - - var sessionFactory = coordinator.BuildSessionFactory(new SessionFactoryBuilderParameters { + var manager = (ISessionFactoryBuilder)new SessionFactoryBuilder(); + var sessionFactory = manager.BuildSessionFactory(new SessionFactoryParameters { + Provider = "SQLite", + DataFolder = _tempDataFolder, UpdateSchema = true, RecordDescriptors = recordDescriptors }); @@ -80,23 +76,21 @@ namespace Orchard.Tests.Data.Migrations { var databasePath = Path.Combine(_tempDataFolder, "Orchard.mdf"); CreateSqlServerDatabase(databasePath); - var manager = (IDatabaseManager)new DatabaseManager(); - var coordinator = manager.CreateCoordinator(new DatabaseParameters { - Provider = "SQLite", - DataFolder = _tempDataFolder, - ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFileName=" + databasePath + ";Integrated Security=True;User Instance=True;", - }); - var recordDescriptors = new[] { new RecordDescriptor {Prefix = "Hello", Type = typeof (Foo)} }; - - var sessionFactory = coordinator.BuildSessionFactory(new SessionFactoryBuilderParameters { + var manager = (ISessionFactoryBuilder)new SessionFactoryBuilder(); + var sessionFactory = manager.BuildSessionFactory(new SessionFactoryParameters { + Provider = "SQLite", + DataFolder = _tempDataFolder, + ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFileName=" + databasePath + ";Integrated Security=True;User Instance=True;", UpdateSchema = true, - RecordDescriptors = recordDescriptors + RecordDescriptors = recordDescriptors, }); + + var session = sessionFactory.OpenSession(); var foo = new Foo { Name = "hi there" }; session.Save(foo); diff --git a/src/Orchard.Tests/DataUtility.cs b/src/Orchard.Tests/DataUtility.cs index d512be4b5..b33704327 100644 --- a/src/Orchard.Tests/DataUtility.cs +++ b/src/Orchard.Tests/DataUtility.cs @@ -19,7 +19,7 @@ namespace Orchard.Tests { //var persistenceModel = AutoMap.Source(new Types(types)) // .Alterations(alt => AddAlterations(alt, types)) // .Conventions.AddFromAssemblyOf(); - var persistenceModel = AbstractSessionFactoryBuilder.CreatePersistenceModel(types.Select(t => new RecordDescriptor { Prefix = "Test", Type = t })); + var persistenceModel = AbstractBuilder.CreatePersistenceModel(types.Select(t => new RecordDescriptor { Prefix = "Test", Type = t })); return Fluently.Configure() .Database(SQLiteConfiguration.Standard.UsingFile(fileName).ShowSql()) diff --git a/src/Orchard/Data/Migrations/AbstractSessionFactoryBuilder.cs b/src/Orchard/Data/Migrations/AbstractBuilder.cs similarity index 89% rename from src/Orchard/Data/Migrations/AbstractSessionFactoryBuilder.cs rename to src/Orchard/Data/Migrations/AbstractBuilder.cs index b8ccae2e4..f4d8869c9 100644 --- a/src/Orchard/Data/Migrations/AbstractSessionFactoryBuilder.cs +++ b/src/Orchard/Data/Migrations/AbstractBuilder.cs @@ -14,10 +14,10 @@ using Orchard.Data.Conventions; using Orchard.Environment; namespace Orchard.Data.Migrations { - public abstract class AbstractSessionFactoryBuilder : ISessionFactoryBuilder { + public abstract class AbstractBuilder { protected abstract IPersistenceConfigurer GetPersistenceConfigurer(); - public ISessionFactory BuildSessionFactory(SessionFactoryBuilderParameters parameters) { + public ISessionFactory BuildSessionFactory(SessionFactoryParameters parameters) { var database = GetPersistenceConfigurer(); var persistenceModel = CreatePersistenceModel(parameters.RecordDescriptors); @@ -30,7 +30,7 @@ namespace Orchard.Data.Migrations { return sessionFactory; } - private static void Initialization(SessionFactoryBuilderParameters parameters, Configuration configuration) { + private static void Initialization(SessionFactoryParameters parameters, Configuration configuration) { if (parameters.UpdateSchema) { var update = new SchemaUpdate(configuration); update.Execute(false/*script*/, true /*doUpdate*/); diff --git a/src/Orchard/Data/Migrations/DatabaseManager.cs b/src/Orchard/Data/Migrations/DatabaseManager.cs deleted file mode 100644 index d7426fd79..000000000 --- a/src/Orchard/Data/Migrations/DatabaseManager.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace Orchard.Data.Migrations { - public class DatabaseManager : IDatabaseManager { - public ISessionFactoryBuilder CreateCoordinator(DatabaseParameters databaseParameters) { - if (string.Equals(databaseParameters.Provider, "SQLite", StringComparison.InvariantCultureIgnoreCase)) - return new SQLiteSessionFactoryBuilder(databaseParameters.DataFolder, databaseParameters.ConnectionString); - return new SqlServerSessionFactoryBuilder(databaseParameters.DataFolder, databaseParameters.ConnectionString); - } - } -} diff --git a/src/Orchard/Data/Migrations/IDatabaseManager.cs b/src/Orchard/Data/Migrations/IDatabaseManager.cs deleted file mode 100644 index 868832267..000000000 --- a/src/Orchard/Data/Migrations/IDatabaseManager.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Orchard.Data.Migrations { - - public interface IDatabaseManager : IDependency { - ISessionFactoryBuilder CreateCoordinator(DatabaseParameters databaseParameters); - } - - public class DatabaseParameters { - public string Provider { get; set; } - public string DataFolder { get; set; } - public string ConnectionString { get; set; } - } -} diff --git a/src/Orchard/Data/Migrations/ISessionFactoryBuilder.cs b/src/Orchard/Data/Migrations/ISessionFactoryBuilder.cs index e0430a88d..b0dc469bb 100644 --- a/src/Orchard/Data/Migrations/ISessionFactoryBuilder.cs +++ b/src/Orchard/Data/Migrations/ISessionFactoryBuilder.cs @@ -3,13 +3,17 @@ using NHibernate; using Orchard.Environment; namespace Orchard.Data.Migrations { - public interface ISessionFactoryBuilder { - ISessionFactory BuildSessionFactory(SessionFactoryBuilderParameters parameters); + + public interface ISessionFactoryBuilder : IDependency { + ISessionFactory BuildSessionFactory(SessionFactoryParameters sessionFactoryParameters); } - public class SessionFactoryBuilderParameters { + public class SessionFactoryParameters { public IEnumerable RecordDescriptors { get; set; } - public bool CreateDatabase { get; set; } public bool UpdateSchema { get; set; } + + public string Provider { get; set; } + public string DataFolder { get; set; } + public string ConnectionString { get; set; } } } diff --git a/src/Orchard/Data/Migrations/SQLiteSessionFactoryBuilder.cs b/src/Orchard/Data/Migrations/SQLiteBuilder.cs similarity index 81% rename from src/Orchard/Data/Migrations/SQLiteSessionFactoryBuilder.cs rename to src/Orchard/Data/Migrations/SQLiteBuilder.cs index 0c6b38461..8e4d1d944 100644 --- a/src/Orchard/Data/Migrations/SQLiteSessionFactoryBuilder.cs +++ b/src/Orchard/Data/Migrations/SQLiteBuilder.cs @@ -2,11 +2,11 @@ using System.IO; using FluentNHibernate.Cfg.Db; namespace Orchard.Data.Migrations { - public class SQLiteSessionFactoryBuilder : AbstractSessionFactoryBuilder { + public class SQLiteBuilder : AbstractBuilder { private readonly string _dataFolder; private readonly string _connectionString; - public SQLiteSessionFactoryBuilder(string dataFolder, string connectionString) { + public SQLiteBuilder(string dataFolder, string connectionString) { _dataFolder = dataFolder; _connectionString = connectionString; } diff --git a/src/Orchard/Data/Migrations/SessionFactoryBuilder.cs b/src/Orchard/Data/Migrations/SessionFactoryBuilder.cs new file mode 100644 index 000000000..67f6f7f6c --- /dev/null +++ b/src/Orchard/Data/Migrations/SessionFactoryBuilder.cs @@ -0,0 +1,17 @@ +using System; +using NHibernate; + +namespace Orchard.Data.Migrations { + public class SessionFactoryBuilder : ISessionFactoryBuilder { + public ISessionFactory BuildSessionFactory(SessionFactoryParameters sessionFactoryParameters) { + AbstractBuilder builder; + if (string.Equals(sessionFactoryParameters.Provider, "SQLite", StringComparison.InvariantCultureIgnoreCase)) { + builder = new SQLiteBuilder(sessionFactoryParameters.DataFolder, sessionFactoryParameters.ConnectionString); + } + else { + builder = new SqlServerBuilder(sessionFactoryParameters.DataFolder, sessionFactoryParameters.ConnectionString); + } + return builder.BuildSessionFactory(sessionFactoryParameters); + } + } +} diff --git a/src/Orchard/Data/Migrations/SqlServerSessionFactoryBuilder.cs b/src/Orchard/Data/Migrations/SqlServerBuilder.cs similarity index 77% rename from src/Orchard/Data/Migrations/SqlServerSessionFactoryBuilder.cs rename to src/Orchard/Data/Migrations/SqlServerBuilder.cs index 71382b182..0e1b2d591 100644 --- a/src/Orchard/Data/Migrations/SqlServerSessionFactoryBuilder.cs +++ b/src/Orchard/Data/Migrations/SqlServerBuilder.cs @@ -2,11 +2,11 @@ using System; using FluentNHibernate.Cfg.Db; namespace Orchard.Data.Migrations { - public class SqlServerSessionFactoryBuilder : AbstractSessionFactoryBuilder { + public class SqlServerBuilder : AbstractBuilder { private readonly string _dataFolder; private readonly string _connectionString; - public SqlServerSessionFactoryBuilder(string dataFolder, string connectionString) { + public SqlServerBuilder(string dataFolder, string connectionString) { _dataFolder = dataFolder; _connectionString = connectionString; } diff --git a/src/Orchard/Data/SessionFactoryHolder.cs b/src/Orchard/Data/SessionFactoryHolder.cs index f02b1c39c..a5f41b99b 100644 --- a/src/Orchard/Data/SessionFactoryHolder.cs +++ b/src/Orchard/Data/SessionFactoryHolder.cs @@ -1,5 +1,4 @@ using System.IO; -using System.Web.Hosting; using NHibernate; using Orchard.Data.Migrations; using Orchard.Environment; @@ -15,7 +14,7 @@ namespace Orchard.Data { public class SessionFactoryHolder : ISessionFactoryHolder { private readonly IShellSettings _shellSettings; private readonly ICompositionStrategy _compositionStrategy; - private readonly IDatabaseManager _databaseManager; + private readonly ISessionFactoryBuilder _sessionFactoryBuilder; private readonly IAppDataFolder _appDataFolder; private ISessionFactory _sessionFactory; @@ -23,11 +22,11 @@ namespace Orchard.Data { public SessionFactoryHolder( IShellSettings shellSettings, ICompositionStrategy compositionStrategy, - IDatabaseManager databaseManager, + ISessionFactoryBuilder sessionFactoryBuilder, IAppDataFolder appDataFolder) { _shellSettings = shellSettings; _compositionStrategy = compositionStrategy; - _databaseManager = databaseManager; + _sessionFactoryBuilder = sessionFactoryBuilder; _appDataFolder = appDataFolder; Logger = NullLogger.Instance; } @@ -41,7 +40,7 @@ namespace Orchard.Data { throw new OrchardException("UpdateSchema can not be called after a session factory was created"); } - _sessionFactory = BuildSessionFactory(true); + _sessionFactory = BuildSessionFactory(true); } } @@ -59,16 +58,12 @@ namespace Orchard.Data { var shellPath = _appDataFolder.CreateDirectory(Path.Combine("Sites", _shellSettings.Name)); - var coordinator = _databaseManager.CreateCoordinator(new DatabaseParameters { + var sessionFactory = _sessionFactoryBuilder.BuildSessionFactory(new SessionFactoryParameters { Provider = _shellSettings.DataProvider, DataFolder = shellPath, - ConnectionString = _shellSettings.DataConnectionString - }); - - var sessionFactory = coordinator.BuildSessionFactory(new SessionFactoryBuilderParameters { - CreateDatabase = false, + ConnectionString = _shellSettings.DataConnectionString, UpdateSchema = updateSchema, - RecordDescriptors = _compositionStrategy.GetRecordDescriptors() + RecordDescriptors = _compositionStrategy.GetRecordDescriptors(), }); return sessionFactory; diff --git a/src/Orchard/Environment/ShellBuilders/SafeModeShellContainerFactory.cs b/src/Orchard/Environment/ShellBuilders/SafeModeShellContainerFactory.cs index 19f087c81..83812e863 100644 --- a/src/Orchard/Environment/ShellBuilders/SafeModeShellContainerFactory.cs +++ b/src/Orchard/Environment/ShellBuilders/SafeModeShellContainerFactory.cs @@ -53,7 +53,7 @@ namespace Orchard.Environment.ShellBuilders { builder.Register().As().ContainerScoped(); 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/Orchard.csproj b/src/Orchard/Orchard.csproj index b56edb72c..0930cbe6b 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -133,12 +133,11 @@ - - - + + - - + +