diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs index 0f71ee82087..e8a03ec6118 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs @@ -11,8 +11,8 @@ using System.Data.Common; using System.Data.Odbc; using System.Data.SqlClient; -using System.Configuration; using System.Transactions; +using NHibernate.Cfg; using NHibernate.Dialect; using NHibernate.Driver; using NHibernate.Engine; @@ -43,9 +43,7 @@ private string FetchConnectionStringFromConfiguration() string connectionStringName; if (cfg.Properties.TryGetValue(Environment.ConnectionStringName, out connectionStringName)) { - var connectionStringSettings = ConfigurationManager.ConnectionStrings[connectionStringName]; - Assert.That(connectionStringSettings, Is.Not.Null); - connectionString = connectionStringSettings.ConnectionString; + connectionString = ConfigurationProvider.Current.GetNamedConnectionString(connectionStringName); Assert.That(connectionString, Is.Not.Null.Or.Empty); return connectionString; } diff --git a/src/NHibernate.Test/CfgTest/ConfigurationSchemaFixture.cs b/src/NHibernate.Test/CfgTest/ConfigurationSchemaFixture.cs index 11c7a28d844..52c3f7b02de 100644 --- a/src/NHibernate.Test/CfgTest/ConfigurationSchemaFixture.cs +++ b/src/NHibernate.Test/CfgTest/ConfigurationSchemaFixture.cs @@ -1,4 +1,3 @@ -using System.Configuration; using NHibernate.Event; using NUnit.Framework; using NHibernate.Cfg; @@ -26,9 +25,7 @@ public void SessionFactoryIsRequiredWhenConfigurationIsNotLoadedFromAppConfig() [Test] public void FromAppConfigTest() { - Assume.That(TestsContext.ExecutingWithVsTest, Is.False); - - IHibernateConfiguration hc = ConfigurationManager.GetSection("hibernate-configuration") as IHibernateConfiguration; + IHibernateConfiguration hc = ConfigurationProvider.Current.GetConfiguration(); Assert.That(hc.ByteCodeProviderType, Is.EqualTo("lcg")); Assert.IsTrue(hc.UseReflectionOptimizer); Assert.AreEqual("NHibernate.Test", hc.SessionFactory.Name); @@ -37,8 +34,6 @@ public void FromAppConfigTest() [Test] public void ByteCodeProvider() { - Assume.That(TestsContext.ExecutingWithVsTest, Is.False); - var xml = @" @@ -54,9 +49,7 @@ public void ByteCodeProvider() [Test] public void IgnoreSystemOutOfAppConfig() { - Assume.That(TestsContext.ExecutingWithVsTest, Is.False); - - IHibernateConfiguration hc = ConfigurationManager.GetSection("hibernate-configuration") as IHibernateConfiguration; + IHibernateConfiguration hc = ConfigurationProvider.Current.GetConfiguration(); string xml = @" @@ -75,8 +68,6 @@ public void IgnoreSystemOutOfAppConfig() [Test] public void ObjectsFactory() { - Assume.That(TestsContext.ExecutingWithVsTest, Is.False); - var xml = @" diff --git a/src/NHibernate.Test/ConnectionStringTest/NamedConnectionStringFixture.cs b/src/NHibernate.Test/ConnectionStringTest/NamedConnectionStringFixture.cs index f44bc304e72..47c5bb86c5a 100644 --- a/src/NHibernate.Test/ConnectionStringTest/NamedConnectionStringFixture.cs +++ b/src/NHibernate.Test/ConnectionStringTest/NamedConnectionStringFixture.cs @@ -35,8 +35,6 @@ public void ConnectionStringInSettingsOverrideNamedConnectionSTring() [Test] public void CanGetNamedConnectionStringFromConfiguration() { - Assume.That(TestsContext.ExecutingWithVsTest, Is.False); - Dictionary settings = new Dictionary(); settings.Add(Environment.ConnectionStringName, "DummyConnectionString"); MockConnectionProvider cp = new MockConnectionProvider(); diff --git a/src/NHibernate.Test/Logging/LoggerProviderTest.cs b/src/NHibernate.Test/Logging/LoggerProviderTest.cs index b00bfa91fbc..8a03dc3e4f2 100644 --- a/src/NHibernate.Test/Logging/LoggerProviderTest.cs +++ b/src/NHibernate.Test/Logging/LoggerProviderTest.cs @@ -24,8 +24,6 @@ public void LoggerProviderCanCreateLoggers_Obsolete() [Test] public void WhenNotConfiguredAndLog4NetExistsThenUseLog4NetFactory() { - Assume.That(TestsContext.ExecutingWithVsTest, Is.False); - // NoLoggingNHibernateLogger is internal Assert.That(NHibernateLogger.For("pizza").GetType().Name, Is.Not.EqualTo("NoLoggingNHibernateLogger")); } @@ -33,8 +31,6 @@ public void WhenNotConfiguredAndLog4NetExistsThenUseLog4NetFactory() [Test, Obsolete] public void WhenNotConfiguredAndLog4NetExistsThenUseLog4NetFactory_Obsolete() { - Assume.That(TestsContext.ExecutingWithVsTest, Is.False); - Assert.That(LoggerProvider.LoggerFor("pizza"), Is.Not.InstanceOf()); // works because this is the legacy provider with a legacy logger diff --git a/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs index 1c80edf6de7..03f470f2443 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs @@ -1,8 +1,8 @@ using System.Data.Common; using System.Data.Odbc; using System.Data.SqlClient; -using System.Configuration; using System.Transactions; +using NHibernate.Cfg; using NHibernate.Dialect; using NHibernate.Driver; using NHibernate.Engine; @@ -32,9 +32,7 @@ private string FetchConnectionStringFromConfiguration() string connectionStringName; if (cfg.Properties.TryGetValue(Environment.ConnectionStringName, out connectionStringName)) { - var connectionStringSettings = ConfigurationManager.ConnectionStrings[connectionStringName]; - Assert.That(connectionStringSettings, Is.Not.Null); - connectionString = connectionStringSettings.ConnectionString; + connectionString = ConfigurationProvider.Current.GetNamedConnectionString(connectionStringName); Assert.That(connectionString, Is.Not.Null.Or.Empty); return connectionString; } diff --git a/src/NHibernate.Test/TestsContext.cs b/src/NHibernate.Test/TestsContext.cs index 41254185afe..4eae9d561e5 100644 --- a/src/NHibernate.Test/TestsContext.cs +++ b/src/NHibernate.Test/TestsContext.cs @@ -1,24 +1,19 @@ -using NUnit.Framework; +#if NETCOREAPP2_0 +using NUnit.Framework; -#if NETCOREAPP2_0 using System.Configuration; using System.IO; using log4net.Repository.Hierarchy; using NHibernate.Cfg; -using NHibernate.Cfg.ConfigurationSchema; -#endif namespace NHibernate.Test { -#if NETCOREAPP2_0 [SetUpFixture] -#endif public class TestsContext { - public static bool ExecutingWithVsTest { get; } = + private static bool ExecutingWithVsTest { get; } = System.Reflection.Assembly.GetEntryAssembly()?.GetName().Name == "testhost"; -#if NETCOREAPP2_0 [OneTimeSetUp] public void RunBeforeAnyTests() { @@ -26,21 +21,13 @@ public void RunBeforeAnyTests() //so we need to explicitly load the configuration if (ExecutingWithVsTest) { - Environment.InitializeGlobalProperties(GetTestAssemblyHibernateConfiguration()); + var assemblyPath = Path.Combine(TestContext.CurrentContext.TestDirectory, Path.GetFileName(typeof(TestsContext).Assembly.Location)); + ConfigurationProvider.Current = new SystemConfigurationProvider(ConfigurationManager.OpenExeConfiguration(assemblyPath)); } ConfigureLog4Net(); } - public static IHibernateConfiguration GetTestAssemblyHibernateConfiguration() - { - var assemblyPath = - Path.Combine(TestContext.CurrentContext.TestDirectory, Path.GetFileName(typeof(TestsContext).Assembly.Location)); - var configuration = ConfigurationManager.OpenExeConfiguration(assemblyPath); - var section = configuration.GetSection(CfgXmlHelper.CfgSectionName); - return HibernateConfiguration.FromAppConfig(section.SectionInformation.GetRawXml()); - } - private static void ConfigureLog4Net() { var hierarchy = (Hierarchy)log4net.LogManager.GetRepository(typeof(TestsContext).Assembly); @@ -58,6 +45,6 @@ private static void ConfigureLog4Net() hierarchy.Root.AddAppender(consoleAppender); hierarchy.Configured = true; } -#endif } } +#endif diff --git a/src/NHibernate/Async/Connection/ConnectionProvider.cs b/src/NHibernate/Async/Connection/ConnectionProvider.cs index 72638e38277..3d04b34668b 100644 --- a/src/NHibernate/Async/Connection/ConnectionProvider.cs +++ b/src/NHibernate/Async/Connection/ConnectionProvider.cs @@ -10,7 +10,6 @@ using System; using System.Collections; -using System.Configuration; using System.Data.Common; using NHibernate.Driver; diff --git a/src/NHibernate/Cfg/AppSettings.cs b/src/NHibernate/Cfg/AppSettings.cs new file mode 100644 index 00000000000..510f12ee3ec --- /dev/null +++ b/src/NHibernate/Cfg/AppSettings.cs @@ -0,0 +1,13 @@ +namespace NHibernate.Cfg +{ + /// + /// Configuration App Settings + /// + public static class AppSettings + { + /// + /// Type that implements + /// + public const string LoggerFactoryClassName = "nhibernate-logger"; + } +} diff --git a/src/NHibernate/Cfg/ConfigurationProvider.cs b/src/NHibernate/Cfg/ConfigurationProvider.cs new file mode 100644 index 00000000000..d793e906ee8 --- /dev/null +++ b/src/NHibernate/Cfg/ConfigurationProvider.cs @@ -0,0 +1,29 @@ +namespace NHibernate.Cfg +{ + /// + /// Base class for NHibernate configuration settings + /// + public abstract class ConfigurationProvider + { + private static ConfigurationProvider _current = new StaticConfigurationManagerProvider(); + + /// + /// Provides ability to override default with custom implementation. + /// Can be set to null if all configuration is specified by code + /// + public static ConfigurationProvider Current + { + get => _current; + set => _current = value ?? new NullConfigurationProvider(); + } + + public abstract IHibernateConfiguration GetConfiguration(); + + public abstract string GetNamedConnectionString(string name); + + /// + /// Type that implements + /// + public abstract string GetLoggerFactoryClassName(); + } +} diff --git a/src/NHibernate/Cfg/Environment.cs b/src/NHibernate/Cfg/Environment.cs index 7ec0b84f69b..6613fe0fd2e 100644 --- a/src/NHibernate/Cfg/Environment.cs +++ b/src/NHibernate/Cfg/Environment.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Configuration; using System.Reflection; using NHibernate.Bytecode; @@ -382,19 +381,10 @@ public static void InitializeGlobalProperties(IHibernateConfiguration config) private static IHibernateConfiguration GetHibernateConfiguration() { - object config = ConfigurationManager.GetSection(CfgXmlHelper.CfgSectionName); - if (config == null) + var nhConfig = ConfigurationProvider.Current.GetConfiguration(); + if (nhConfig == null && log.IsInfoEnabled()) { log.Info("{0} section not found in application configuration file", CfgXmlHelper.CfgSectionName); - return null; - } - - var nhConfig = config as IHibernateConfiguration; - if (nhConfig == null) - { - log.Info( - "{0} section handler, in application configuration file, is not IHibernateConfiguration, section ignored", - CfgXmlHelper.CfgSectionName); } return nhConfig; @@ -566,7 +556,6 @@ private static IObjectsFactory CreateCustomObjectsFactory(string assemblyQualifi } } - /// /// Get a named connection string, if configured. /// @@ -576,18 +565,13 @@ private static IObjectsFactory CreateCustomObjectsFactory(string assemblyQualifi /// internal static string GetNamedConnectionString(IDictionary settings) { - string connStringName; - if (!settings.TryGetValue(ConnectionStringName, out connStringName)) + if (!settings.TryGetValue(ConnectionStringName, out var connStringName)) return null; - ConnectionStringSettings connectionStringSettings = ConfigurationManager.ConnectionStrings[connStringName]; - if (connectionStringSettings == null) - throw new HibernateException($"Could not find named connection string '{connStringName}'."); - - return connectionStringSettings.ConnectionString; + return ConfigurationProvider.Current.GetNamedConnectionString(connStringName) + ?? throw new HibernateException($"Could not find named connection string '{connStringName}'."); } - /// /// Get the configured connection string, from if that /// is set, otherwise from , or null if that isn't diff --git a/src/NHibernate/Cfg/NullConfigurationProvider.cs b/src/NHibernate/Cfg/NullConfigurationProvider.cs new file mode 100644 index 00000000000..7954d738ddf --- /dev/null +++ b/src/NHibernate/Cfg/NullConfigurationProvider.cs @@ -0,0 +1,20 @@ +namespace NHibernate.Cfg +{ + class NullConfigurationProvider : ConfigurationProvider + { + public override IHibernateConfiguration GetConfiguration() + { + return null; + } + + public override string GetNamedConnectionString(string name) + { + return null; + } + + public override string GetLoggerFactoryClassName() + { + return null; + } + } +} diff --git a/src/NHibernate/Cfg/StaticConfigurationManagerProvider.cs b/src/NHibernate/Cfg/StaticConfigurationManagerProvider.cs new file mode 100644 index 00000000000..8bc4abaa2d8 --- /dev/null +++ b/src/NHibernate/Cfg/StaticConfigurationManagerProvider.cs @@ -0,0 +1,42 @@ +using System; +using System.Configuration; +using System.Linq; +using NHibernate.Cfg.ConfigurationSchema; + +namespace NHibernate.Cfg +{ + class StaticConfigurationManagerProvider : ConfigurationProvider + { + public override IHibernateConfiguration GetConfiguration() + { + //TODO 6.0: Throw if not null and not IHibernateConfiguration + return ConfigurationManager.GetSection(CfgXmlHelper.CfgSectionName) as IHibernateConfiguration; + } + + public override string GetNamedConnectionString(string name) + { + return ConfigurationManager.ConnectionStrings[name]?.ConnectionString; + } + + public override string GetLoggerFactoryClassName() + { + var name = AppSettings.LoggerFactoryClassName; + var value = ConfigurationManager.AppSettings[name]; + + //TODO 6.0: Return value right away. Don't do ignore case search and document it as possible breaking change. + if (value != null) + return value; + + return GetAppSettingIgnoreCase(name); + } + + //TODO 6.0: Remove it + private static string GetAppSettingIgnoreCase(string name) + { + var key = ConfigurationManager.AppSettings.Keys.Cast().FirstOrDefault(k => name.Equals(k, StringComparison.OrdinalIgnoreCase)); + return string.IsNullOrEmpty(key) + ? null + : ConfigurationManager.AppSettings[key]; + } + } +} diff --git a/src/NHibernate/Cfg/SystemConfigurationProvider.cs b/src/NHibernate/Cfg/SystemConfigurationProvider.cs new file mode 100644 index 00000000000..87499d3cff8 --- /dev/null +++ b/src/NHibernate/Cfg/SystemConfigurationProvider.cs @@ -0,0 +1,40 @@ +using System.Configuration; +using NHibernate.Cfg.ConfigurationSchema; + +namespace NHibernate.Cfg +{ + /// + /// Configuration manager that supports user provided configuration + /// + public class SystemConfigurationProvider : ConfigurationProvider + { + private readonly System.Configuration.Configuration _configuration; + + public SystemConfigurationProvider(System.Configuration.Configuration configuration) + { + _configuration = configuration; + } + + public override IHibernateConfiguration GetConfiguration() + { + ConfigurationSection configurationSection = _configuration.GetSection(CfgXmlHelper.CfgSectionName); + var xml = configurationSection?.SectionInformation.GetRawXml(); + return xml == null ? null : HibernateConfiguration.FromAppConfig(xml); + } + + public override string GetNamedConnectionString(string name) + { + return _configuration.ConnectionStrings.ConnectionStrings[name]?.ConnectionString; + } + + public override string GetLoggerFactoryClassName() + { + return GetAppSetting(AppSettings.LoggerFactoryClassName); + } + + private string GetAppSetting(string name) + { + return _configuration.AppSettings.Settings[name]?.Value; + } + } +} diff --git a/src/NHibernate/Connection/ConnectionProvider.cs b/src/NHibernate/Connection/ConnectionProvider.cs index de244c75b08..a49012c1262 100644 --- a/src/NHibernate/Connection/ConnectionProvider.cs +++ b/src/NHibernate/Connection/ConnectionProvider.cs @@ -1,6 +1,5 @@ using System; using System.Collections; -using System.Configuration; using System.Data.Common; using NHibernate.Driver; diff --git a/src/NHibernate/Logging.cs b/src/NHibernate/Logging.cs index a2af219798a..2039c18abb6 100644 --- a/src/NHibernate/Logging.cs +++ b/src/NHibernate/Logging.cs @@ -1,6 +1,5 @@ using System; -using System.Configuration; -using System.Linq; +using NHibernate.Cfg; using System.Runtime.CompilerServices; namespace NHibernate @@ -49,7 +48,6 @@ public interface INHibernateLoggerFactory /// public static class NHibernateLogger { - private const string nhibernateLoggerConfKey = "nhibernate-logger"; private static INHibernateLoggerFactory _loggerFactory; #pragma warning disable 618 @@ -135,9 +133,8 @@ public static INHibernateLogger For(System.Type type) private static string GetNhibernateLoggerClass() { - var nhibernateLogger = ConfigurationManager.AppSettings.Keys.Cast().FirstOrDefault(k => nhibernateLoggerConfKey.Equals(k, StringComparison.OrdinalIgnoreCase)); - string nhibernateLoggerClass = null; - if (string.IsNullOrEmpty(nhibernateLogger)) + var nhibernateLoggerClass = ConfigurationProvider.Current.GetLoggerFactoryClassName(); + if (nhibernateLoggerClass == null) { // look for log4net if (Log4NetLoggerFactory.Log4NetAssembly != null) @@ -145,10 +142,6 @@ private static string GetNhibernateLoggerClass() nhibernateLoggerClass = typeof(Log4NetLoggerFactory).AssemblyQualifiedName; } } - else - { - nhibernateLoggerClass = ConfigurationManager.AppSettings[nhibernateLogger]; - } return nhibernateLoggerClass; }