/// <summary>
        /// Collect migrations in one <c>Assembly</c>.
        /// </summary>
        /// <param name="asm">The <c>Assembly</c> to browse.</param>
        private static List<MigrationInfo> GetMigrationInfoList(Assembly asm)
        {
            var migrations = new List<MigrationInfo>();

            foreach (Type type in asm.GetExportedTypes())
            {
                var attribute = type.GetCustomAttribute<MigrationAttribute>();

                if (attribute != null
                    && typeof(IMigration).IsAssignableFrom(type)
                    && !attribute.Ignore)
                {
                    var mi = new MigrationInfo(type);
                    migrations.Add(mi);
                }
            }

            migrations.Sort(new MigrationInfoComparer());

            // пишем в лог список загруженных миграций
            StringBuilder logMessageBuilder = new StringBuilder("Loaded migrations:").AppendLine();

            foreach (MigrationInfo mi in migrations)
            {
                string msg = string.Format("{0} {1}", mi.Version.ToString().PadLeft(5), StringUtils.ToHumanName(mi.Type.Name));
                logMessageBuilder.AppendLine(msg);
            }

            MigratorLogManager.Log.Info(logMessageBuilder.ToString());

            return migrations;
        }
        /// <summary>
        /// Создать миграцию по номеру версии
        /// </summary>
        /// <param name="migrationInfo">Информация о миграции</param>
        /// <param name="provider">Провайдер СУБД для установки в качестве текущего провайдера миграции</param>
        public IMigration InstantiateMigration(MigrationInfo migrationInfo, ITransformationProvider provider)
        {
            Require.IsNotNull(provider, "Не задан провайдер СУБД");
            Require.IsNotNull(migrationInfo.Type, "Не задан класс миграции");

            var migration = (IMigration)Activator.CreateInstance(migrationInfo.Type);
            migration.Database = provider;
            return migration;
        }