Refactoring database session builder

Reducing the implementation to what's needed at the moment
Making the individual providers an implementation detail

--HG--
branch : dev
This commit is contained in:
Louis DeJardin
2010-02-15 12:54:27 -08:00
parent 62465ff1da
commit 91a34a35ff
12 changed files with 58 additions and 72 deletions

View File

@@ -47,17 +47,13 @@ namespace Orchard.Tests.Data.Migrations {
[Test] [Test]
public void SQLiteSchemaShouldBeGeneratedAndUsable() { 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)} new RecordDescriptor {Prefix = "Hello", Type = typeof (Foo)}
}; };
var manager = (ISessionFactoryBuilder)new SessionFactoryBuilder();
var sessionFactory = coordinator.BuildSessionFactory(new SessionFactoryBuilderParameters { var sessionFactory = manager.BuildSessionFactory(new SessionFactoryParameters {
Provider = "SQLite",
DataFolder = _tempDataFolder,
UpdateSchema = true, UpdateSchema = true,
RecordDescriptors = recordDescriptors RecordDescriptors = recordDescriptors
}); });
@@ -80,23 +76,21 @@ namespace Orchard.Tests.Data.Migrations {
var databasePath = Path.Combine(_tempDataFolder, "Orchard.mdf"); var databasePath = Path.Combine(_tempDataFolder, "Orchard.mdf");
CreateSqlServerDatabase(databasePath); 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[] { var recordDescriptors = new[] {
new RecordDescriptor {Prefix = "Hello", Type = typeof (Foo)} new RecordDescriptor {Prefix = "Hello", Type = typeof (Foo)}
}; };
var manager = (ISessionFactoryBuilder)new SessionFactoryBuilder();
var sessionFactory = coordinator.BuildSessionFactory(new SessionFactoryBuilderParameters { var sessionFactory = manager.BuildSessionFactory(new SessionFactoryParameters {
Provider = "SQLite",
DataFolder = _tempDataFolder,
ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFileName=" + databasePath + ";Integrated Security=True;User Instance=True;",
UpdateSchema = true, UpdateSchema = true,
RecordDescriptors = recordDescriptors RecordDescriptors = recordDescriptors,
}); });
var session = sessionFactory.OpenSession(); var session = sessionFactory.OpenSession();
var foo = new Foo { Name = "hi there" }; var foo = new Foo { Name = "hi there" };
session.Save(foo); session.Save(foo);

View File

@@ -19,7 +19,7 @@ namespace Orchard.Tests {
//var persistenceModel = AutoMap.Source(new Types(types)) //var persistenceModel = AutoMap.Source(new Types(types))
// .Alterations(alt => AddAlterations(alt, types)) // .Alterations(alt => AddAlterations(alt, types))
// .Conventions.AddFromAssemblyOf<DataModule>(); // .Conventions.AddFromAssemblyOf<DataModule>();
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() return Fluently.Configure()
.Database(SQLiteConfiguration.Standard.UsingFile(fileName).ShowSql()) .Database(SQLiteConfiguration.Standard.UsingFile(fileName).ShowSql())

View File

@@ -14,10 +14,10 @@ using Orchard.Data.Conventions;
using Orchard.Environment; using Orchard.Environment;
namespace Orchard.Data.Migrations { namespace Orchard.Data.Migrations {
public abstract class AbstractSessionFactoryBuilder : ISessionFactoryBuilder { public abstract class AbstractBuilder {
protected abstract IPersistenceConfigurer GetPersistenceConfigurer(); protected abstract IPersistenceConfigurer GetPersistenceConfigurer();
public ISessionFactory BuildSessionFactory(SessionFactoryBuilderParameters parameters) { public ISessionFactory BuildSessionFactory(SessionFactoryParameters parameters) {
var database = GetPersistenceConfigurer(); var database = GetPersistenceConfigurer();
var persistenceModel = CreatePersistenceModel(parameters.RecordDescriptors); var persistenceModel = CreatePersistenceModel(parameters.RecordDescriptors);
@@ -30,7 +30,7 @@ namespace Orchard.Data.Migrations {
return sessionFactory; return sessionFactory;
} }
private static void Initialization(SessionFactoryBuilderParameters parameters, Configuration configuration) { private static void Initialization(SessionFactoryParameters parameters, Configuration configuration) {
if (parameters.UpdateSchema) { if (parameters.UpdateSchema) {
var update = new SchemaUpdate(configuration); var update = new SchemaUpdate(configuration);
update.Execute(false/*script*/, true /*doUpdate*/); update.Execute(false/*script*/, true /*doUpdate*/);

View File

@@ -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);
}
}
}

View File

@@ -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; }
}
}

View File

@@ -3,13 +3,17 @@ using NHibernate;
using Orchard.Environment; using Orchard.Environment;
namespace Orchard.Data.Migrations { 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<RecordDescriptor> RecordDescriptors { get; set; } public IEnumerable<RecordDescriptor> RecordDescriptors { get; set; }
public bool CreateDatabase { get; set; }
public bool UpdateSchema { get; set; } public bool UpdateSchema { get; set; }
public string Provider { get; set; }
public string DataFolder { get; set; }
public string ConnectionString { get; set; }
} }
} }

View File

@@ -2,11 +2,11 @@ using System.IO;
using FluentNHibernate.Cfg.Db; using FluentNHibernate.Cfg.Db;
namespace Orchard.Data.Migrations { namespace Orchard.Data.Migrations {
public class SQLiteSessionFactoryBuilder : AbstractSessionFactoryBuilder { public class SQLiteBuilder : AbstractBuilder {
private readonly string _dataFolder; private readonly string _dataFolder;
private readonly string _connectionString; private readonly string _connectionString;
public SQLiteSessionFactoryBuilder(string dataFolder, string connectionString) { public SQLiteBuilder(string dataFolder, string connectionString) {
_dataFolder = dataFolder; _dataFolder = dataFolder;
_connectionString = connectionString; _connectionString = connectionString;
} }

View File

@@ -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);
}
}
}

View File

@@ -2,11 +2,11 @@ using System;
using FluentNHibernate.Cfg.Db; using FluentNHibernate.Cfg.Db;
namespace Orchard.Data.Migrations { namespace Orchard.Data.Migrations {
public class SqlServerSessionFactoryBuilder : AbstractSessionFactoryBuilder { public class SqlServerBuilder : AbstractBuilder {
private readonly string _dataFolder; private readonly string _dataFolder;
private readonly string _connectionString; private readonly string _connectionString;
public SqlServerSessionFactoryBuilder(string dataFolder, string connectionString) { public SqlServerBuilder(string dataFolder, string connectionString) {
_dataFolder = dataFolder; _dataFolder = dataFolder;
_connectionString = connectionString; _connectionString = connectionString;
} }

View File

@@ -1,5 +1,4 @@
using System.IO; using System.IO;
using System.Web.Hosting;
using NHibernate; using NHibernate;
using Orchard.Data.Migrations; using Orchard.Data.Migrations;
using Orchard.Environment; using Orchard.Environment;
@@ -15,7 +14,7 @@ namespace Orchard.Data {
public class SessionFactoryHolder : ISessionFactoryHolder { public class SessionFactoryHolder : ISessionFactoryHolder {
private readonly IShellSettings _shellSettings; private readonly IShellSettings _shellSettings;
private readonly ICompositionStrategy _compositionStrategy; private readonly ICompositionStrategy _compositionStrategy;
private readonly IDatabaseManager _databaseManager; private readonly ISessionFactoryBuilder _sessionFactoryBuilder;
private readonly IAppDataFolder _appDataFolder; private readonly IAppDataFolder _appDataFolder;
private ISessionFactory _sessionFactory; private ISessionFactory _sessionFactory;
@@ -23,11 +22,11 @@ namespace Orchard.Data {
public SessionFactoryHolder( public SessionFactoryHolder(
IShellSettings shellSettings, IShellSettings shellSettings,
ICompositionStrategy compositionStrategy, ICompositionStrategy compositionStrategy,
IDatabaseManager databaseManager, ISessionFactoryBuilder sessionFactoryBuilder,
IAppDataFolder appDataFolder) { IAppDataFolder appDataFolder) {
_shellSettings = shellSettings; _shellSettings = shellSettings;
_compositionStrategy = compositionStrategy; _compositionStrategy = compositionStrategy;
_databaseManager = databaseManager; _sessionFactoryBuilder = sessionFactoryBuilder;
_appDataFolder = appDataFolder; _appDataFolder = appDataFolder;
Logger = NullLogger.Instance; Logger = NullLogger.Instance;
} }
@@ -59,16 +58,12 @@ namespace Orchard.Data {
var shellPath = _appDataFolder.CreateDirectory(Path.Combine("Sites", _shellSettings.Name)); var shellPath = _appDataFolder.CreateDirectory(Path.Combine("Sites", _shellSettings.Name));
var coordinator = _databaseManager.CreateCoordinator(new DatabaseParameters { var sessionFactory = _sessionFactoryBuilder.BuildSessionFactory(new SessionFactoryParameters {
Provider = _shellSettings.DataProvider, Provider = _shellSettings.DataProvider,
DataFolder = shellPath, DataFolder = shellPath,
ConnectionString = _shellSettings.DataConnectionString ConnectionString = _shellSettings.DataConnectionString,
});
var sessionFactory = coordinator.BuildSessionFactory(new SessionFactoryBuilderParameters {
CreateDatabase = false,
UpdateSchema = updateSchema, UpdateSchema = updateSchema,
RecordDescriptors = _compositionStrategy.GetRecordDescriptors() RecordDescriptors = _compositionStrategy.GetRecordDescriptors(),
}); });
return sessionFactory; return sessionFactory;

View File

@@ -53,7 +53,7 @@ namespace Orchard.Environment.ShellBuilders {
builder.Register<PageClassBuilder>().As<IPageClassBuilder>().ContainerScoped(); builder.Register<PageClassBuilder>().As<IPageClassBuilder>().ContainerScoped();
builder.Register<Notifier>().As<INotifier>().ContainerScoped(); builder.Register<Notifier>().As<INotifier>().ContainerScoped();
builder.Register<NotifyFilter>().As<IFilterProvider>().ContainerScoped(); builder.Register<NotifyFilter>().As<IFilterProvider>().ContainerScoped();
builder.Register<DatabaseManager>().As<IDatabaseManager>().ContainerScoped(); builder.Register<SessionFactoryBuilder>().As<ISessionFactoryBuilder>().ContainerScoped();
// safe mode specific implementations of needed service interfaces // safe mode specific implementations of needed service interfaces
builder.Register<NullHackInstallationGenerator>().As<IHackInstallationGenerator>().ContainerScoped(); builder.Register<NullHackInstallationGenerator>().As<IHackInstallationGenerator>().ContainerScoped();

View File

@@ -133,12 +133,11 @@
<Compile Include="ContentManagement\Handlers\RemoveContentContext.cs" /> <Compile Include="ContentManagement\Handlers\RemoveContentContext.cs" />
<Compile Include="ContentManagement\Handlers\VersionContentContext.cs" /> <Compile Include="ContentManagement\Handlers\VersionContentContext.cs" />
<Compile Include="Data\Conventions\RecordTableNameConvention.cs" /> <Compile Include="Data\Conventions\RecordTableNameConvention.cs" />
<Compile Include="Data\Migrations\AbstractSessionFactoryBuilder.cs" /> <Compile Include="Data\Migrations\AbstractBuilder.cs" />
<Compile Include="Data\Migrations\DatabaseManager.cs" /> <Compile Include="Data\Migrations\SessionFactoryBuilder.cs" />
<Compile Include="Data\Migrations\IDatabaseManager.cs" />
<Compile Include="Data\Migrations\ISessionFactoryBuilder.cs" /> <Compile Include="Data\Migrations\ISessionFactoryBuilder.cs" />
<Compile Include="Data\Migrations\SQLiteSessionFactoryBuilder.cs" /> <Compile Include="Data\Migrations\SQLiteBuilder.cs" />
<Compile Include="Data\Migrations\SqlServerSessionFactoryBuilder.cs" /> <Compile Include="Data\Migrations\SqlServerBuilder.cs" />
<Compile Include="Data\SessionFactoryHolder.cs" /> <Compile Include="Data\SessionFactoryHolder.cs" />
<Compile Include="Environment\Configuration\AppDataFolder.cs" /> <Compile Include="Environment\Configuration\AppDataFolder.cs" />
<Compile Include="Environment\Configuration\ShellSettingsLoader.cs" /> <Compile Include="Environment\Configuration\ShellSettingsLoader.cs" />