jueves, 17 de septiembre de 2015

NHibernateManagerSql.cs

using System;
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