mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-09-22 20:13:50 +08:00
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:
@@ -47,17 +47,13 @@ namespace Orchard.Tests.Data.Migrations {
|
|||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void SQLiteSchemaShouldBeGeneratedAndUsable() {
|
public void SQLiteSchemaShouldBeGeneratedAndUsable() {
|
||||||
var manager = (IDatabaseManager)new DatabaseManager();
|
var recordDescriptors = new[] {
|
||||||
var coordinator = manager.CreateCoordinator(new DatabaseParameters {
|
|
||||||
Provider = "SQLite",
|
|
||||||
DataFolder = _tempDataFolder
|
|
||||||
});
|
|
||||||
|
|
||||||
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);
|
||||||
|
@@ -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())
|
||||||
|
@@ -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*/);
|
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -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; }
|
|
||||||
}
|
|
||||||
}
|
|
@@ -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; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
17
src/Orchard/Data/Migrations/SessionFactoryBuilder.cs
Normal file
17
src/Orchard/Data/Migrations/SessionFactoryBuilder.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -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;
|
||||||
}
|
}
|
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -41,7 +40,7 @@ namespace Orchard.Data {
|
|||||||
throw new OrchardException("UpdateSchema can not be called after a session factory was created");
|
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 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;
|
||||||
|
@@ -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();
|
||||||
|
@@ -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" />
|
||||||
|
Reference in New Issue
Block a user