Exemple #1
0
        public static DbConnection GetDatabaseConnection(IDatabaseModuleConfig config)
        {
            var conn = DbProviderFactories.GetFactory(config.DatabaseProvider).CreateConnection();

            conn.ConnectionString = config.DatabaseConnectionString;
            return(conn);
        }
Exemple #2
0
        public static DbContextOptions <T> GetContextOptions <T>(IDatabaseModuleConfig config)
            where T : DbContext
        {
            var builder = new DbContextOptionsBuilder <T>();

            // SomeMethod(DbContextOptionsBuilder builder, string connectionString [, optionally more parameters with default values])
            Assembly ass = Assembly.Load(new AssemblyName(config.DatabaseProviderAssembly));
            Type     configuratorType = ass.GetType(config.DatabaseConfiguratorClass);

            MethodInfo configuratorMethod = null;

            ParameterInfo[] configuratorParameters = null;
            foreach (MethodInfo candidateMethod in configuratorType.GetMethods())
            {
                if (candidateMethod.Name != config.DatabaseConfiguratorMethod)
                {
                    continue;
                }

                if (!candidateMethod.IsPublic || !candidateMethod.IsStatic)
                {
                    continue;
                }

                configuratorParameters = candidateMethod.GetParameters();
                if (configuratorParameters.Length < 2)
                {
                    continue;
                }

                if (!configuratorParameters[0].ParameterType.IsAssignableFrom(builder.GetType()))
                {
                    continue;
                }

                if (configuratorParameters[1].ParameterType != typeof(string))
                {
                    continue;
                }

                if (!configuratorParameters.Skip(2).All(param => param.HasDefaultValue))
                {
                    continue;
                }

                configuratorMethod = candidateMethod;
                break;
            }

            if (configuratorMethod == null)
            {
                throw new KeyNotFoundException($"no viable configurator method named {config.DatabaseConfiguratorMethod} found in {ass.FullName}");
            }

            var parameters = new object[configuratorParameters.Length];

            parameters[0] = builder;
            parameters[1] = config.DatabaseConnectionString;
            for (int i = 2; i < parameters.Length; ++i)
            {
                parameters[i] = configuratorParameters[i].DefaultValue;
            }

            configuratorMethod.Invoke(null, parameters);

            return(builder.Options);
        }