public IMigrator CreateMigrator(Assembly assembly, string scope, int version)
        {
            if (assembly == null)
            {
                throw new ArgumentNullException("assembly");
            }
            if (scope == null)
            {
                throw new ArgumentNullException("scope");
            }

            if (ConfigurationManager.ConnectionStrings[ConnStrName] == null)
            {
                throw new Exception(ConnStrName + " connection string configuration not found.");
            }

            var connstr = ConfigurationManager.ConnectionStrings[ConnStrName].ConnectionString;

            var config = new StaticMigratorConfiguration {ConnectionString = connstr, CommandTimeout = 300};

            IConnectionProvider connProvider = new SQLiteConnectionProvider(config);
            ITransactionProvider transProvider = new TransactionProvider(connProvider);
            IDatabaseProvider dbProvider = new SQLiteDatabaseProvider(connProvider, transProvider, config);
            ISchemaProvider schemaProvider = new SQLiteSchemaProvider(dbProvider);

            ISchemaStateManager schemaStateManager = new SQLiteSchemaStateManager(dbProvider, schemaProvider);
            IVersionStateFactory versionStateFactory = new SQLiteVersionStateFactory(config, schemaStateManager);

            IMigrationFinder finder = new AssemblyMigrationFinder(assembly);

            IMigrationSelector selector = new MigrationSelector(finder, versionStateFactory);

            IMigrationFactoryChooser chooser = new WindsorBasedFactoryChooser(kernel);
            ICommonTransformations common = new CommonTransformations(dbProvider, schemaProvider);

            IMigrationInitializer initializer = new MigrationInitializer(config, dbProvider, schemaProvider, common, connProvider);
            IMigrationRunner runner = new MigrationRunner(chooser, initializer, schemaStateManager, config, transProvider);
            IWorkingDirectoryManager workDirMng = new NoOpWorkingDirectoryManager();

            IMigrator migrator = new Migrator(selector, runner, dbProvider, schemaStateManager, workDirMng);

            //MigrationScope migrationScope = null;
            migrator.Start += delegate {  };
            migrator.End += delegate {  };

            return migrator;
        }
        public IMigrator CreateMigrator(Assembly assembly, string scope, ISession session)
        {
            if (assembly == null)
            {
                throw new ArgumentNullException("assembly");
            }
            if (scope == null)
            {
                throw new ArgumentNullException("scope");
            }

            var config = new StaticMigratorConfiguration();
            config.Scope = scope;

            INHibernateSessionProvider hibernateSessionProvider = new StaticNHibernateSessionProvider(session);

            IConnectionProvider connProvider = new NHibernateConnectionProvider(hibernateSessionProvider);
            ITransactionProvider transProvider = new NHibernateTransactionProvider(hibernateSessionProvider);
            IDatabaseProvider dbProvider = new SQLiteDatabaseProvider(connProvider, transProvider, config);
            ISchemaProvider schemaProvider = new SQLiteSchemaProvider(dbProvider);

            ISchemaStateManager schemaStateManager = new SQLiteSchemaStateManager(dbProvider, schemaProvider);
            IVersionStateFactory versionStateFactory = new SQLiteVersionStateFactory(config, schemaStateManager);

            IMigrationFinder finder = new AssemblyMigrationFinder(assembly);

            IMigrationSelector selector = new MigrationSelector(finder, versionStateFactory);

            IMigrationFactoryChooser chooser = new WindsorBasedFactoryChooser(kernel);
            ICommonTransformations common = new CommonTransformations(dbProvider, schemaProvider);

            IMigrationInitializer initializer = new MigrationInitializer(config, dbProvider, schemaProvider, common,
                                                                            connProvider);
            IMigrationRunner runner = new MigrationRunner(chooser, initializer, schemaStateManager, config,
                                                            transProvider);
            IWorkingDirectoryManager workDirMng = new NoOpWorkingDirectoryManager();

            IMigrator migrator = new Migrator(selector, runner, dbProvider, schemaStateManager, workDirMng);

            //MigrationScope migrationScope = null;

            migrator.Start += delegate {  };
            migrator.End += delegate { };

            return migrator;
        }
        // --

        public static ServiceRegistry Create()
        {
            DataSettings dataSettings      = DataSettings.Current;
            string       databasesPath     = dataSettings.GetSysDatabaseDirectory().FullName;
            string       userDatabasesPath = Path.Combine(databasesPath, "UserDbs");

            AppConf                           conf         = new AppConf(BamConf.Load(ServiceConfig.ContentRoot), ServiceConfig.ProcessName.Or(RegistryName));
            UserManager                       userMgr      = conf.UserManagerConfig.Create();
            DaoUserResolver                   userResolver = new DaoUserResolver();
            DaoRoleResolver                   roleResolver = new DaoRoleResolver();
            SQLiteDatabaseProvider            dbProvider   = new SQLiteDatabaseProvider(databasesPath, Log.Default);
            ApplicationRegistrationRepository coreRepo     = new ApplicationRegistrationRepository();

            dbProvider.SetDatabases(coreRepo);
            dbProvider.SetDatabases(userMgr);
            userMgr.Database.TryEnsureSchema(typeof(UserAccounts.Data.User), Log.Default);
            userResolver.Database = userMgr.Database;
            roleResolver.Database = userMgr.Database;

            ServiceRegistryRepository serviceRegistryRepo = new ServiceRegistryRepository();

            serviceRegistryRepo.Database = dataSettings.GetSysDatabaseFor(serviceRegistryRepo);
            serviceRegistryRepo.EnsureDaoAssemblyAndSchema();

            DaoRoleProvider           daoRoleProvider = new DaoRoleProvider(userMgr.Database);
            RoleService               coreRoleService = new RoleService(daoRoleProvider, conf);
            AssemblyServiceRepository assSvcRepo      = new AssemblyServiceRepository();

            assSvcRepo.Database = dataSettings.GetSysDatabaseFor(assSvcRepo);
            assSvcRepo.EnsureDaoAssemblyAndSchema();

            ConfigurationService configSvc     = new ConfigurationService(coreRepo, conf, userDatabasesPath);
            CompositeRepository  compositeRepo = new CompositeRepository(coreRepo);
            SystemLoggerService  loggerSvc     = new SystemLoggerService(conf);

            dbProvider.SetDatabases(loggerSvc);
            loggerSvc.SetLogger();

            ServiceRegistry reg = (ServiceRegistry)(new ServiceRegistry())
                                  .ForCtor <ConfigurationService>("databaseRoot").Use(userDatabasesPath)
                                  .ForCtor <ConfigurationService>("conf").Use(conf)
                                  .ForCtor <ConfigurationService>("coreRepo").Use(coreRepo)
                                  .For <ILogger>().Use(Log.Default)
                                  .For <IRepository>().Use(coreRepo)
                                  .For <DaoRepository>().Use(coreRepo)
                                  .For <ApplicationRegistrationRepository>().Use(coreRepo)
                                  .For <AppConf>().Use(conf)
                                  .For <IDatabaseProvider>().Use(dbProvider)
                                  .For <IUserManager>().Use(userMgr)
                                  .For <UserManager>().Use(userMgr)
                                  .For <IUserResolver>().Use(userResolver)
                                  .For <DaoUserResolver>().Use(userResolver)
                                  .For <IRoleResolver>().Use(roleResolver)
                                  .For <DaoRoleResolver>().Use(roleResolver)
                                  .For <IRoleProvider>().Use(coreRoleService)
                                  .For <RoleService>().Use(coreRoleService)
                                  .For <EmailComposer>().Use(userMgr.EmailComposer)
                                  .For <IApplicationNameProvider>().Use <ApplicationRegistrationService>()
                                  .For <ApplicationRegistrationService>().Use <ApplicationRegistrationService>()
                                  .For <IApiKeyResolver>().Use <ApplicationRegistrationService>()
                                  .For <ISmtpSettingsProvider>().Use(userMgr)
                                  .For <UserRegistryService>().Use <UserRegistryService>()
                                  .For <ConfigurationService>().Use(configSvc)
                                  .For <IStorableTypesProvider>().Use <NamespaceRepositoryStorableTypesProvider>()
                                  .For <FileService>().Use <FileService>()
                                  .For <IFileService>().Use <FileService>()
                                  .For <AssemblyServiceRepository>().Use(assSvcRepo)
                                  .For <IAssemblyService>().Use <AssemblyService>()
                                  .For <ServiceRegistryRepository>().Use(serviceRegistryRepo)
                                  .For <ServiceRegistryService>().Use <ServiceRegistryService>()
                                  .For <OAuthService>().Use <OAuthService>()
                                  .For <ILog>().Use(loggerSvc)
                                  .For <SystemLoggerService>().Use(loggerSvc)
                                  .For <DataSettings>().Use(DataSettings.Current)
                                  .For <IApplicationNameResolver>().Use <ClientApplicationNameResolver>()
                                  .For <ClientApplicationNameResolver>().Use <ClientApplicationNameResolver>()
                                  .For <SmtpSettingsProvider>().Use(DataSettingsSmtpSettingsProvider.Default)
                                  .For <NotificationService>().Use <NotificationService>()
                                  .For <ILogReader>().Use <SystemLogReaderService>()
                                  .For <CredentialManagementService>().Use <CredentialManagementService>();

            reg.For <ServiceRegistry>().Use(reg)
            .For <DiagnosticService>().Use <DiagnosticService>();

            reg.SetProperties(userMgr);
            userMgr.ServiceProvider = reg;

            reg.For <CompositeRepository>().Use(() =>
            {
                compositeRepo.AddTypes(reg.Get <IStorableTypesProvider>().GetTypes());
                return(compositeRepo);
            });

            ServiceProxySystem.UserResolvers.Clear();
            ServiceProxySystem.RoleResolvers.Clear();
            ServiceProxySystem.UserResolvers.AddResolver(userResolver);
            ServiceProxySystem.RoleResolvers.AddResolver(roleResolver);
            reg.Name = RegistryName;
            return(reg);
        }