using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate.Cfg;
using NHibernate;
using FluentNHibernate.Cfg;
namespace Migration.Target.Dao.UnitOfWork
{
public sealed class NHibernateManagerSql
{
internal sealed class NHibernateSettings
{
public Type DbContextType { get; private set; }
public string ConfigFileName { get; private set; }
public Configuration Configuration { get; private set; }
public ISessionFactory SessionFactory { get; private set; }
internal NHibernateSettings(Type dbContextType, string configFileName, Configuration configuration, ISessionFactory sessionFactory)
{
this.DbContextType = dbContextType;
this.ConfigFileName = configFileName;
this.Configuration = configuration;
this.SessionFactory = sessionFactory;
}
}
#region Singleton
private static readonly object sync = new object();
private static NHibernateManagerSql _instance;
public static NHibernateManagerSql Instance
{
get
{
if (_instance == null)
{
lock (sync)
{
if (_instance == null)
_instance = new NHibernateManagerSql();
}
}
return _instance;
}
}
#endregion
private IList<NHibernateSettings> _dbs;
private NHibernateManagerSql()
: base()
{
this._dbs = new List<NHibernateSettings>();
}
internal ISession GetNewSession(Type dbUnitType, string configFileName, Action<FluentMappingsContainer> modelBuilder)
{
NHibernateSettings dbItem = this._dbs.FirstOrDefault(x => x.DbContextType == dbUnitType && x.ConfigFileName == configFileName);
ISessionFactory sessionFactory;
if (dbItem != null)
{
sessionFactory = dbItem.SessionFactory;
}
else
{
Configuration configuration = new Configuration();
configuration.Configure(configFileName);
FluentConfiguration fluentConfiguration = Fluently.Configure(configuration);
fluentConfiguration.Mappings(m => modelBuilder(m.FluentMappings));
sessionFactory = fluentConfiguration.BuildSessionFactory();
this._dbs.Add(new NHibernateSettings(dbUnitType, configFileName, configuration, sessionFactory));
}
return sessionFactory.OpenSession();
}
internal Configuration GetConfiguration(Type dbUnitType, string configFileName)
{
NHibernateSettings dbItem = this._dbs.FirstOrDefault(x => x.DbContextType == dbUnitType && x.ConfigFileName == configFileName);
return dbItem.Configuration;
}
}
}
No hay comentarios:
Publicar un comentario