From 28b0a96fa70412f643db7c06b31af94b26e328c6 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Wed, 10 Apr 2019 19:27:15 +0300 Subject: [PATCH 01/11] Ability to replace ConfigurationManager with custom configuration provider --- .../Async/NHSpecificTest/NH2420/Fixture.cs | 5 +- .../CfgTest/ConfigurationSchemaFixture.cs | 13 +---- .../NamedConnectionStringFixture.cs | 2 - .../Logging/LoggerProviderTest.cs | 4 -- .../NHSpecificTest/NH2420/Fixture.cs | 5 +- src/NHibernate.Test/TestsContext.cs | 49 +++++++++---------- .../Async/Connection/ConnectionProvider.cs | 1 - src/NHibernate/Cfg/Environment.cs | 14 +----- src/NHibernate/Cfg/IConfigurationManager.cs | 47 ++++++++++++++++++ src/NHibernate/Cfg/Settings.cs | 5 ++ .../Connection/ConnectionProvider.cs | 8 ++- src/NHibernate/Logging.cs | 12 ++--- 12 files changed, 88 insertions(+), 77 deletions(-) create mode 100644 src/NHibernate/Cfg/IConfigurationManager.cs diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs index 0f71ee82087..db3b9c2ea4d 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs @@ -11,7 +11,6 @@ using System.Data.Common; using System.Data.Odbc; using System.Data.SqlClient; -using System.Configuration; using System.Transactions; using NHibernate.Dialect; using NHibernate.Driver; @@ -43,9 +42,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 = Cfg.Settings.ConfigurationManager.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..9a2629953eb 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 = Cfg.Settings.ConfigurationManager.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 = Cfg.Settings.ConfigurationManager.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..dd4df3b2540 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs @@ -1,7 +1,6 @@ using System.Data.Common; using System.Data.Odbc; using System.Data.SqlClient; -using System.Configuration; using System.Transactions; using NHibernate.Dialect; using NHibernate.Driver; @@ -32,9 +31,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 = Cfg.Settings.ConfigurationManager.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..33143a938a9 100644 --- a/src/NHibernate.Test/TestsContext.cs +++ b/src/NHibernate.Test/TestsContext.cs @@ -3,7 +3,6 @@ #if NETCOREAPP2_0 using System.Configuration; using System.IO; -using log4net.Repository.Hierarchy; using NHibernate.Cfg; using NHibernate.Cfg.ConfigurationSchema; #endif @@ -15,7 +14,7 @@ namespace NHibernate.Test #endif public class TestsContext { - public static bool ExecutingWithVsTest { get; } = + private static bool ExecutingWithVsTest { get; } = System.Reflection.Assembly.GetEntryAssembly()?.GetName().Name == "testhost"; #if NETCOREAPP2_0 @@ -26,37 +25,37 @@ public void RunBeforeAnyTests() //so we need to explicitly load the configuration if (ExecutingWithVsTest) { - Environment.InitializeGlobalProperties(GetTestAssemblyHibernateConfiguration()); + Settings.ConfigurationManager = new NetCoreConfigurationManager(); } - - ConfigureLog4Net(); } - public static IHibernateConfiguration GetTestAssemblyHibernateConfiguration() + class NetCoreConfigurationManager : IConfigurationManager { - 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 readonly System.Configuration.Configuration _configuration; - private static void ConfigureLog4Net() - { - var hierarchy = (Hierarchy)log4net.LogManager.GetRepository(typeof(TestsContext).Assembly); + public NetCoreConfigurationManager() + { + var assemblyPath = + Path.Combine(TestContext.CurrentContext.TestDirectory, Path.GetFileName(typeof(TestsContext).Assembly.Location)); + _configuration = ConfigurationManager.OpenExeConfiguration(assemblyPath); + } + + public IHibernateConfiguration GetConfiguration() + { + ConfigurationSection configurationSection = _configuration.GetSection(CfgXmlHelper.CfgSectionName); + var xml = configurationSection?.SectionInformation.GetRawXml(); + return xml == null ? null : HibernateConfiguration.FromAppConfig(xml); + } - var consoleAppender = new log4net.Appender.ConsoleAppender + public string GetNamedConnectionString(string name) { - Layout = new log4net.Layout.PatternLayout("%d{ABSOLUTE} %-5p %c{1}:%L - %m%n"), - }; + return _configuration.ConnectionStrings.ConnectionStrings[name]?.ConnectionString; + } - ((Logger)hierarchy.GetLogger("NHibernate.Hql.Ast.ANTLR")).Level = log4net.Core.Level.Off; - ((Logger)hierarchy.GetLogger("NHibernate.SQL")).Level = log4net.Core.Level.Off; - ((Logger)hierarchy.GetLogger("NHibernate.AdoNet.AbstractBatcher")).Level = log4net.Core.Level.Off; - ((Logger)hierarchy.GetLogger("NHibernate.Tool.hbm2ddl.SchemaExport")).Level = log4net.Core.Level.Error; - hierarchy.Root.Level = log4net.Core.Level.Warn; - hierarchy.Root.AddAppender(consoleAppender); - hierarchy.Configured = true; + public string GetAppSetting(string name) + { + return _configuration.AppSettings.Settings[name]?.Value; + } } #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/Environment.cs b/src/NHibernate/Cfg/Environment.cs index 0a72d83e0a4..4cdd3e464bd 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; @@ -370,19 +369,10 @@ public static void InitializeGlobalProperties(IHibernateConfiguration config) private static IHibernateConfiguration GetHibernateConfiguration() { - object config = ConfigurationManager.GetSection(CfgXmlHelper.CfgSectionName); - if (config == null) + var nhConfig = Settings.ConfigurationManager.GetConfiguration();; + if (log.IsInfoEnabled() && nhConfig == null) { 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; diff --git a/src/NHibernate/Cfg/IConfigurationManager.cs b/src/NHibernate/Cfg/IConfigurationManager.cs new file mode 100644 index 00000000000..4c6d928a597 --- /dev/null +++ b/src/NHibernate/Cfg/IConfigurationManager.cs @@ -0,0 +1,47 @@ +using System; +using System.Configuration; +using System.Linq; + +namespace NHibernate.Cfg +{ + internal static class ConfigurationManagerExtensions + { + //TODO 6.0: Replace with GetAppSetting and document as possible breaking change all usages. + internal static string GetAppSettingIgnoringCase(this IConfigurationManager config, string name) + { + if (!(config is SystemConfigurationManager)) + return config.GetAppSetting(name); + + var key = ConfigurationManager.AppSettings.Keys.Cast().FirstOrDefault(k => name.Equals(k, StringComparison.OrdinalIgnoreCase)); + return string.IsNullOrEmpty(key) + ? null + : ConfigurationManager.AppSettings[key]; + } + } + + public interface IConfigurationManager + { + IHibernateConfiguration GetConfiguration(); + string GetNamedConnectionString(string name); + string GetAppSetting(string name); + } + + class SystemConfigurationManager : IConfigurationManager + { + public IHibernateConfiguration GetConfiguration() + { + //TODO 6.0: Throw if not null and not IHibernateConfiguration + return ConfigurationManager.GetSection(ConfigurationSchema.CfgXmlHelper.CfgSectionName) as IHibernateConfiguration; + } + + public string GetNamedConnectionString(string name) + { + return ConfigurationManager.ConnectionStrings[name]?.ConnectionString; + } + + public string GetAppSetting(string name) + { + return ConfigurationManager.AppSettings[name]; + } + } +} diff --git a/src/NHibernate/Cfg/Settings.cs b/src/NHibernate/Cfg/Settings.cs index 4d4fc1fa96e..c493b1feaeb 100644 --- a/src/NHibernate/Cfg/Settings.cs +++ b/src/NHibernate/Cfg/Settings.cs @@ -18,6 +18,11 @@ namespace NHibernate.Cfg /// public sealed class Settings { + /// + /// Provides ability to override default with custom implementation. + /// + public static IConfigurationManager ConfigurationManager { get; set; } = new SystemConfigurationManager(); + public Settings() { MaximumFetchDepth = -1; diff --git a/src/NHibernate/Connection/ConnectionProvider.cs b/src/NHibernate/Connection/ConnectionProvider.cs index 90059ec1cf8..a38e249179d 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; @@ -77,10 +76,9 @@ protected virtual string GetNamedConnectionString(IDictionary se if(!settings.TryGetValue(Environment.ConnectionStringName, out connStringName)) return null; - ConnectionStringSettings connectionStringSettings = ConfigurationManager.ConnectionStrings[connStringName]; - if (connectionStringSettings == null) - throw new HibernateException(string.Format("Could not find named connection string {0}", connStringName)); - return connectionStringSettings.ConnectionString; + var connectionString = Cfg.Settings.ConfigurationManager.GetNamedConnectionString(connStringName) + ?? throw new HibernateException(string.Format("Could not find named connection string {0}", connStringName)); + return connectionString; } /// diff --git a/src/NHibernate/Logging.cs b/src/NHibernate/Logging.cs index a2af219798a..6ee21cfd5d3 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 @@ -135,9 +134,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 = Settings.ConfigurationManager.GetAppSettingIgnoringCase(nhibernateLoggerConfKey); + if (nhibernateLoggerClass == null) { // look for log4net if (Log4NetLoggerFactory.Log4NetAssembly != null) @@ -145,10 +143,6 @@ private static string GetNhibernateLoggerClass() nhibernateLoggerClass = typeof(Log4NetLoggerFactory).AssemblyQualifiedName; } } - else - { - nhibernateLoggerClass = ConfigurationManager.AppSettings[nhibernateLogger]; - } return nhibernateLoggerClass; } From 9f2b4a55380b8b0ef0f0846aa6c0868386bd41f0 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Wed, 10 Apr 2019 20:55:48 +0300 Subject: [PATCH 02/11] Restore logger configuration --- src/NHibernate.Test/TestsContext.cs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/NHibernate.Test/TestsContext.cs b/src/NHibernate.Test/TestsContext.cs index 33143a938a9..9551bc83b72 100644 --- a/src/NHibernate.Test/TestsContext.cs +++ b/src/NHibernate.Test/TestsContext.cs @@ -3,6 +3,7 @@ #if NETCOREAPP2_0 using System.Configuration; using System.IO; +using log4net.Repository.Hierarchy; using NHibernate.Cfg; using NHibernate.Cfg.ConfigurationSchema; #endif @@ -27,6 +28,26 @@ public void RunBeforeAnyTests() { Settings.ConfigurationManager = new NetCoreConfigurationManager(); } + + ConfigureLog4Net(); + } + + private static void ConfigureLog4Net() + { + var hierarchy = (Hierarchy)log4net.LogManager.GetRepository(typeof(TestsContext).Assembly); + + var consoleAppender = new log4net.Appender.ConsoleAppender + { + Layout = new log4net.Layout.PatternLayout("%d{ABSOLUTE} %-5p %c{1}:%L - %m%n"), + }; + + ((Logger)hierarchy.GetLogger("NHibernate.Hql.Ast.ANTLR")).Level = log4net.Core.Level.Off; + ((Logger)hierarchy.GetLogger("NHibernate.SQL")).Level = log4net.Core.Level.Off; + ((Logger)hierarchy.GetLogger("NHibernate.AdoNet.AbstractBatcher")).Level = log4net.Core.Level.Off; + ((Logger)hierarchy.GetLogger("NHibernate.Tool.hbm2ddl.SchemaExport")).Level = log4net.Core.Level.Error; + hierarchy.Root.Level = log4net.Core.Level.Warn; + hierarchy.Root.AddAppender(consoleAppender); + hierarchy.Configured = true; } class NetCoreConfigurationManager : IConfigurationManager From d2c690f56aa5f8c932a20958e2abb6be517ff460 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Thu, 11 Apr 2019 08:08:52 +0300 Subject: [PATCH 03/11] Add "null" ConfigurationManager --- src/NHibernate/Cfg/IConfigurationManager.cs | 18 ++++++++++++++++++ src/NHibernate/Cfg/Settings.cs | 11 +++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/NHibernate/Cfg/IConfigurationManager.cs b/src/NHibernate/Cfg/IConfigurationManager.cs index 4c6d928a597..d9b5eb9bab6 100644 --- a/src/NHibernate/Cfg/IConfigurationManager.cs +++ b/src/NHibernate/Cfg/IConfigurationManager.cs @@ -44,4 +44,22 @@ public string GetAppSetting(string name) return ConfigurationManager.AppSettings[name]; } } + + class NullConfigurationManager : IConfigurationManager + { + public IHibernateConfiguration GetConfiguration() + { + return null; + } + + public string GetNamedConnectionString(string name) + { + return null; + } + + public string GetAppSetting(string name) + { + return null; + } + } } diff --git a/src/NHibernate/Cfg/Settings.cs b/src/NHibernate/Cfg/Settings.cs index c493b1feaeb..ff60f53aff4 100644 --- a/src/NHibernate/Cfg/Settings.cs +++ b/src/NHibernate/Cfg/Settings.cs @@ -18,10 +18,17 @@ namespace NHibernate.Cfg /// public sealed class Settings { + private static IConfigurationManager _configurationManager = new SystemConfigurationManager(); + /// - /// Provides ability to override default with custom implementation. + /// Provides ability to override default with custom implementation. + /// Can be set to null if all configuration is specified by code /// - public static IConfigurationManager ConfigurationManager { get; set; } = new SystemConfigurationManager(); + public static IConfigurationManager ConfigurationManager + { + get => _configurationManager; + set => _configurationManager = value ?? new NullConfigurationManager(); + } public Settings() { From 60bab544f7eb9c9445ceb950f5416be62248d002 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Thu, 11 Apr 2019 13:53:08 +0300 Subject: [PATCH 04/11] Add SystemConfigurationManager that supports user provided Configuration --- src/NHibernate.Test/TestsContext.cs | 33 ++------------------- src/NHibernate/Cfg/IConfigurationManager.cs | 32 ++++++++++++++++++-- src/NHibernate/Cfg/Settings.cs | 2 +- 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/src/NHibernate.Test/TestsContext.cs b/src/NHibernate.Test/TestsContext.cs index 9551bc83b72..4b8b844babf 100644 --- a/src/NHibernate.Test/TestsContext.cs +++ b/src/NHibernate.Test/TestsContext.cs @@ -5,7 +5,6 @@ using System.IO; using log4net.Repository.Hierarchy; using NHibernate.Cfg; -using NHibernate.Cfg.ConfigurationSchema; #endif namespace NHibernate.Test @@ -26,7 +25,8 @@ public void RunBeforeAnyTests() //so we need to explicitly load the configuration if (ExecutingWithVsTest) { - Settings.ConfigurationManager = new NetCoreConfigurationManager(); + var assemblyPath = Path.Combine(TestContext.CurrentContext.TestDirectory, Path.GetFileName(typeof(TestsContext).Assembly.Location)); + Settings.ConfigurationManager = new SystemConfigurationManager(ConfigurationManager.OpenExeConfiguration(assemblyPath)); } ConfigureLog4Net(); @@ -49,35 +49,6 @@ private static void ConfigureLog4Net() hierarchy.Root.AddAppender(consoleAppender); hierarchy.Configured = true; } - - class NetCoreConfigurationManager : IConfigurationManager - { - private readonly System.Configuration.Configuration _configuration; - - public NetCoreConfigurationManager() - { - var assemblyPath = - Path.Combine(TestContext.CurrentContext.TestDirectory, Path.GetFileName(typeof(TestsContext).Assembly.Location)); - _configuration = ConfigurationManager.OpenExeConfiguration(assemblyPath); - } - - public IHibernateConfiguration GetConfiguration() - { - ConfigurationSection configurationSection = _configuration.GetSection(CfgXmlHelper.CfgSectionName); - var xml = configurationSection?.SectionInformation.GetRawXml(); - return xml == null ? null : HibernateConfiguration.FromAppConfig(xml); - } - - public string GetNamedConnectionString(string name) - { - return _configuration.ConnectionStrings.ConnectionStrings[name]?.ConnectionString; - } - - public string GetAppSetting(string name) - { - return _configuration.AppSettings.Settings[name]?.Value; - } - } #endif } } diff --git a/src/NHibernate/Cfg/IConfigurationManager.cs b/src/NHibernate/Cfg/IConfigurationManager.cs index d9b5eb9bab6..a929209aaf6 100644 --- a/src/NHibernate/Cfg/IConfigurationManager.cs +++ b/src/NHibernate/Cfg/IConfigurationManager.cs @@ -1,6 +1,7 @@ using System; using System.Configuration; using System.Linq; +using NHibernate.Cfg.ConfigurationSchema; namespace NHibernate.Cfg { @@ -9,7 +10,7 @@ internal static class ConfigurationManagerExtensions //TODO 6.0: Replace with GetAppSetting and document as possible breaking change all usages. internal static string GetAppSettingIgnoringCase(this IConfigurationManager config, string name) { - if (!(config is SystemConfigurationManager)) + if (!(config is StaticSystemConfigurationManager)) return config.GetAppSetting(name); var key = ConfigurationManager.AppSettings.Keys.Cast().FirstOrDefault(k => name.Equals(k, StringComparison.OrdinalIgnoreCase)); @@ -26,7 +27,34 @@ public interface IConfigurationManager string GetAppSetting(string name); } - class SystemConfigurationManager : IConfigurationManager + public class SystemConfigurationManager : IConfigurationManager + { + private readonly System.Configuration.Configuration _configuration; + + public SystemConfigurationManager(System.Configuration.Configuration configuration) + { + _configuration = configuration; + } + + public IHibernateConfiguration GetConfiguration() + { + ConfigurationSection configurationSection = _configuration.GetSection(CfgXmlHelper.CfgSectionName); + var xml = configurationSection?.SectionInformation.GetRawXml(); + return xml == null ? null : HibernateConfiguration.FromAppConfig(xml); + } + + public string GetNamedConnectionString(string name) + { + return _configuration.ConnectionStrings.ConnectionStrings[name]?.ConnectionString; + } + + public string GetAppSetting(string name) + { + return _configuration.AppSettings.Settings[name]?.Value; + } + } + + class StaticSystemConfigurationManager : IConfigurationManager { public IHibernateConfiguration GetConfiguration() { diff --git a/src/NHibernate/Cfg/Settings.cs b/src/NHibernate/Cfg/Settings.cs index ff60f53aff4..c9952b3bd05 100644 --- a/src/NHibernate/Cfg/Settings.cs +++ b/src/NHibernate/Cfg/Settings.cs @@ -18,7 +18,7 @@ namespace NHibernate.Cfg /// public sealed class Settings { - private static IConfigurationManager _configurationManager = new SystemConfigurationManager(); + private static IConfigurationManager _configurationManager = new StaticSystemConfigurationManager(); /// /// Provides ability to override default with custom implementation. From 0c1909ba2ecb52c942af28f3f4098852e7327490 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Tue, 1 Oct 2019 16:25:28 +0300 Subject: [PATCH 05/11] Use abstract class for extensibility and replace GetAppConfig with specific configuration settings --- src/NHibernate/Cfg/AppSettings.cs | 13 +++ .../Cfg/ConfigurationManagerBase.cs | 109 ++++++++++++++++++ src/NHibernate/Cfg/IConfigurationManager.cs | 93 --------------- src/NHibernate/Cfg/Settings.cs | 4 +- src/NHibernate/Logging.cs | 3 +- 5 files changed, 125 insertions(+), 97 deletions(-) create mode 100644 src/NHibernate/Cfg/AppSettings.cs create mode 100644 src/NHibernate/Cfg/ConfigurationManagerBase.cs delete mode 100644 src/NHibernate/Cfg/IConfigurationManager.cs 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/ConfigurationManagerBase.cs b/src/NHibernate/Cfg/ConfigurationManagerBase.cs new file mode 100644 index 00000000000..d7e4d22cbf3 --- /dev/null +++ b/src/NHibernate/Cfg/ConfigurationManagerBase.cs @@ -0,0 +1,109 @@ +using System; +using System.Configuration; +using System.Linq; +using NHibernate.Cfg.ConfigurationSchema; + +namespace NHibernate.Cfg +{ + /// + /// Base class for configuration settings that NHibernate might require. + /// + public abstract class ConfigurationManagerBase + { + public abstract IHibernateConfiguration GetConfiguration(); + public abstract string GetNamedConnectionString(string name); + + /// + /// Type that implements + /// + public abstract string GetLoggerFactoryClassName(); + } + + /// + /// Configuration manager that supports user provided configuration + /// + public class SystemConfigurationManager : ConfigurationManagerBase + { + private readonly System.Configuration.Configuration _configuration; + + public SystemConfigurationManager(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; + } + } + + class StaticSystemConfigurationManager : ConfigurationManagerBase + { + 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]; + } + } + + class NullConfigurationManager : ConfigurationManagerBase + { + 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/IConfigurationManager.cs b/src/NHibernate/Cfg/IConfigurationManager.cs deleted file mode 100644 index a929209aaf6..00000000000 --- a/src/NHibernate/Cfg/IConfigurationManager.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using System.Configuration; -using System.Linq; -using NHibernate.Cfg.ConfigurationSchema; - -namespace NHibernate.Cfg -{ - internal static class ConfigurationManagerExtensions - { - //TODO 6.0: Replace with GetAppSetting and document as possible breaking change all usages. - internal static string GetAppSettingIgnoringCase(this IConfigurationManager config, string name) - { - if (!(config is StaticSystemConfigurationManager)) - return config.GetAppSetting(name); - - var key = ConfigurationManager.AppSettings.Keys.Cast().FirstOrDefault(k => name.Equals(k, StringComparison.OrdinalIgnoreCase)); - return string.IsNullOrEmpty(key) - ? null - : ConfigurationManager.AppSettings[key]; - } - } - - public interface IConfigurationManager - { - IHibernateConfiguration GetConfiguration(); - string GetNamedConnectionString(string name); - string GetAppSetting(string name); - } - - public class SystemConfigurationManager : IConfigurationManager - { - private readonly System.Configuration.Configuration _configuration; - - public SystemConfigurationManager(System.Configuration.Configuration configuration) - { - _configuration = configuration; - } - - public IHibernateConfiguration GetConfiguration() - { - ConfigurationSection configurationSection = _configuration.GetSection(CfgXmlHelper.CfgSectionName); - var xml = configurationSection?.SectionInformation.GetRawXml(); - return xml == null ? null : HibernateConfiguration.FromAppConfig(xml); - } - - public string GetNamedConnectionString(string name) - { - return _configuration.ConnectionStrings.ConnectionStrings[name]?.ConnectionString; - } - - public string GetAppSetting(string name) - { - return _configuration.AppSettings.Settings[name]?.Value; - } - } - - class StaticSystemConfigurationManager : IConfigurationManager - { - public IHibernateConfiguration GetConfiguration() - { - //TODO 6.0: Throw if not null and not IHibernateConfiguration - return ConfigurationManager.GetSection(ConfigurationSchema.CfgXmlHelper.CfgSectionName) as IHibernateConfiguration; - } - - public string GetNamedConnectionString(string name) - { - return ConfigurationManager.ConnectionStrings[name]?.ConnectionString; - } - - public string GetAppSetting(string name) - { - return ConfigurationManager.AppSettings[name]; - } - } - - class NullConfigurationManager : IConfigurationManager - { - public IHibernateConfiguration GetConfiguration() - { - return null; - } - - public string GetNamedConnectionString(string name) - { - return null; - } - - public string GetAppSetting(string name) - { - return null; - } - } -} diff --git a/src/NHibernate/Cfg/Settings.cs b/src/NHibernate/Cfg/Settings.cs index c9952b3bd05..156102a0057 100644 --- a/src/NHibernate/Cfg/Settings.cs +++ b/src/NHibernate/Cfg/Settings.cs @@ -18,13 +18,13 @@ namespace NHibernate.Cfg /// public sealed class Settings { - private static IConfigurationManager _configurationManager = new StaticSystemConfigurationManager(); + private static ConfigurationManagerBase _configurationManager = new StaticSystemConfigurationManager(); /// /// Provides ability to override default with custom implementation. /// Can be set to null if all configuration is specified by code /// - public static IConfigurationManager ConfigurationManager + public static ConfigurationManagerBase ConfigurationManager { get => _configurationManager; set => _configurationManager = value ?? new NullConfigurationManager(); diff --git a/src/NHibernate/Logging.cs b/src/NHibernate/Logging.cs index 6ee21cfd5d3..f781948bda0 100644 --- a/src/NHibernate/Logging.cs +++ b/src/NHibernate/Logging.cs @@ -48,7 +48,6 @@ public interface INHibernateLoggerFactory /// public static class NHibernateLogger { - private const string nhibernateLoggerConfKey = "nhibernate-logger"; private static INHibernateLoggerFactory _loggerFactory; #pragma warning disable 618 @@ -134,7 +133,7 @@ public static INHibernateLogger For(System.Type type) private static string GetNhibernateLoggerClass() { - var nhibernateLoggerClass = Settings.ConfigurationManager.GetAppSettingIgnoringCase(nhibernateLoggerConfKey); + var nhibernateLoggerClass = Settings.ConfigurationManager.GetLoggerFactoryClassName(); if (nhibernateLoggerClass == null) { // look for log4net From ed3c4c404c884b202fe6b696cd446fde28790e7d Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Tue, 1 Oct 2019 21:09:57 +0300 Subject: [PATCH 06/11] formatting --- src/NHibernate/Cfg/Environment.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NHibernate/Cfg/Environment.cs b/src/NHibernate/Cfg/Environment.cs index 4cdd3e464bd..85ef83d476a 100644 --- a/src/NHibernate/Cfg/Environment.cs +++ b/src/NHibernate/Cfg/Environment.cs @@ -369,8 +369,8 @@ public static void InitializeGlobalProperties(IHibernateConfiguration config) private static IHibernateConfiguration GetHibernateConfiguration() { - var nhConfig = Settings.ConfigurationManager.GetConfiguration();; - if (log.IsInfoEnabled() && nhConfig == null) + var nhConfig = Settings.ConfigurationManager.GetConfiguration(); + if (nhConfig == null && log.IsInfoEnabled()) { log.Info("{0} section not found in application configuration file", CfgXmlHelper.CfgSectionName); } From 86d1635ece2a69a0c30c81d1d5ffdcb6f2b75001 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Wed, 2 Oct 2019 09:34:42 +0300 Subject: [PATCH 07/11] Address comments --- src/NHibernate.Test/TestsContext.cs | 10 +- .../Cfg/ConfigurationManagerBase.cs | 109 ------------------ src/NHibernate/Cfg/ConfigurationProvider.cs | 16 +++ .../Cfg/NullConfigurationManager.cs | 20 ++++ src/NHibernate/Cfg/Settings.cs | 4 +- .../Cfg/StaticSystemConfigurationManager.cs | 42 +++++++ .../Cfg/SystemConfigurationManager.cs | 40 +++++++ 7 files changed, 123 insertions(+), 118 deletions(-) delete mode 100644 src/NHibernate/Cfg/ConfigurationManagerBase.cs create mode 100644 src/NHibernate/Cfg/ConfigurationProvider.cs create mode 100644 src/NHibernate/Cfg/NullConfigurationManager.cs create mode 100644 src/NHibernate/Cfg/StaticSystemConfigurationManager.cs create mode 100644 src/NHibernate/Cfg/SystemConfigurationManager.cs diff --git a/src/NHibernate.Test/TestsContext.cs b/src/NHibernate.Test/TestsContext.cs index 4b8b844babf..773529c47f7 100644 --- a/src/NHibernate.Test/TestsContext.cs +++ b/src/NHibernate.Test/TestsContext.cs @@ -1,23 +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; -#endif namespace NHibernate.Test { -#if NETCOREAPP2_0 [SetUpFixture] -#endif public class TestsContext { private static bool ExecutingWithVsTest { get; } = System.Reflection.Assembly.GetEntryAssembly()?.GetName().Name == "testhost"; -#if NETCOREAPP2_0 [OneTimeSetUp] public void RunBeforeAnyTests() { @@ -49,6 +45,6 @@ private static void ConfigureLog4Net() hierarchy.Root.AddAppender(consoleAppender); hierarchy.Configured = true; } -#endif } } +#endif diff --git a/src/NHibernate/Cfg/ConfigurationManagerBase.cs b/src/NHibernate/Cfg/ConfigurationManagerBase.cs deleted file mode 100644 index d7e4d22cbf3..00000000000 --- a/src/NHibernate/Cfg/ConfigurationManagerBase.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -using System.Configuration; -using System.Linq; -using NHibernate.Cfg.ConfigurationSchema; - -namespace NHibernate.Cfg -{ - /// - /// Base class for configuration settings that NHibernate might require. - /// - public abstract class ConfigurationManagerBase - { - public abstract IHibernateConfiguration GetConfiguration(); - public abstract string GetNamedConnectionString(string name); - - /// - /// Type that implements - /// - public abstract string GetLoggerFactoryClassName(); - } - - /// - /// Configuration manager that supports user provided configuration - /// - public class SystemConfigurationManager : ConfigurationManagerBase - { - private readonly System.Configuration.Configuration _configuration; - - public SystemConfigurationManager(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; - } - } - - class StaticSystemConfigurationManager : ConfigurationManagerBase - { - 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]; - } - } - - class NullConfigurationManager : ConfigurationManagerBase - { - 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/ConfigurationProvider.cs b/src/NHibernate/Cfg/ConfigurationProvider.cs new file mode 100644 index 00000000000..f474b5ab765 --- /dev/null +++ b/src/NHibernate/Cfg/ConfigurationProvider.cs @@ -0,0 +1,16 @@ +namespace NHibernate.Cfg +{ + /// + /// Base class for NHibernate configuration settings + /// + public abstract class ConfigurationProvider + { + public abstract IHibernateConfiguration GetConfiguration(); + public abstract string GetNamedConnectionString(string name); + + /// + /// Type that implements + /// + public abstract string GetLoggerFactoryClassName(); + } +} diff --git a/src/NHibernate/Cfg/NullConfigurationManager.cs b/src/NHibernate/Cfg/NullConfigurationManager.cs new file mode 100644 index 00000000000..2af1007a9a7 --- /dev/null +++ b/src/NHibernate/Cfg/NullConfigurationManager.cs @@ -0,0 +1,20 @@ +namespace NHibernate.Cfg +{ + class NullConfigurationManager : 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/Settings.cs b/src/NHibernate/Cfg/Settings.cs index 156102a0057..9ab3c783ae9 100644 --- a/src/NHibernate/Cfg/Settings.cs +++ b/src/NHibernate/Cfg/Settings.cs @@ -18,13 +18,13 @@ namespace NHibernate.Cfg /// public sealed class Settings { - private static ConfigurationManagerBase _configurationManager = new StaticSystemConfigurationManager(); + private static ConfigurationProvider _configurationManager = new StaticSystemConfigurationManager(); /// /// Provides ability to override default with custom implementation. /// Can be set to null if all configuration is specified by code /// - public static ConfigurationManagerBase ConfigurationManager + public static ConfigurationProvider ConfigurationManager { get => _configurationManager; set => _configurationManager = value ?? new NullConfigurationManager(); diff --git a/src/NHibernate/Cfg/StaticSystemConfigurationManager.cs b/src/NHibernate/Cfg/StaticSystemConfigurationManager.cs new file mode 100644 index 00000000000..4ee020d5db3 --- /dev/null +++ b/src/NHibernate/Cfg/StaticSystemConfigurationManager.cs @@ -0,0 +1,42 @@ +using System; +using System.Configuration; +using System.Linq; +using NHibernate.Cfg.ConfigurationSchema; + +namespace NHibernate.Cfg +{ + class StaticSystemConfigurationManager : 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/SystemConfigurationManager.cs b/src/NHibernate/Cfg/SystemConfigurationManager.cs new file mode 100644 index 00000000000..367481a9c92 --- /dev/null +++ b/src/NHibernate/Cfg/SystemConfigurationManager.cs @@ -0,0 +1,40 @@ +using System.Configuration; +using NHibernate.Cfg.ConfigurationSchema; + +namespace NHibernate.Cfg +{ + /// + /// Configuration manager that supports user provided configuration + /// + public class SystemConfigurationManager : ConfigurationProvider + { + private readonly System.Configuration.Configuration _configuration; + + public SystemConfigurationManager(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; + } + } +} From 2fdfbb989887feabd51b265323842a6b7d345319 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Wed, 2 Oct 2019 12:57:10 +0300 Subject: [PATCH 08/11] Rename ConfigurationProvider related objects --- .../Async/NHSpecificTest/NH2420/Fixture.cs | 2 +- src/NHibernate.Test/CfgTest/ConfigurationSchemaFixture.cs | 4 ++-- src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs | 2 +- src/NHibernate.Test/TestsContext.cs | 2 +- src/NHibernate/Cfg/Environment.cs | 2 +- src/NHibernate/Cfg/NullConfigurationManager.cs | 2 +- src/NHibernate/Cfg/Settings.cs | 8 ++++---- ...onManager.cs => StaticConfigurationManagerProvider.cs} | 2 +- src/NHibernate/Cfg/SystemConfigurationManager.cs | 4 ++-- src/NHibernate/Connection/ConnectionProvider.cs | 2 +- src/NHibernate/Logging.cs | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-) rename src/NHibernate/Cfg/{StaticSystemConfigurationManager.cs => StaticConfigurationManagerProvider.cs} (94%) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs index db3b9c2ea4d..e59a3931dfc 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs @@ -42,7 +42,7 @@ private string FetchConnectionStringFromConfiguration() string connectionStringName; if (cfg.Properties.TryGetValue(Environment.ConnectionStringName, out connectionStringName)) { - connectionString = Cfg.Settings.ConfigurationManager.GetNamedConnectionString(connectionStringName); + connectionString = Cfg.Settings.ConfigurationProvider.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 9a2629953eb..52b4acdf2f0 100644 --- a/src/NHibernate.Test/CfgTest/ConfigurationSchemaFixture.cs +++ b/src/NHibernate.Test/CfgTest/ConfigurationSchemaFixture.cs @@ -25,7 +25,7 @@ public void SessionFactoryIsRequiredWhenConfigurationIsNotLoadedFromAppConfig() [Test] public void FromAppConfigTest() { - IHibernateConfiguration hc = Cfg.Settings.ConfigurationManager.GetConfiguration(); + IHibernateConfiguration hc = Cfg.Settings.ConfigurationProvider.GetConfiguration(); Assert.That(hc.ByteCodeProviderType, Is.EqualTo("lcg")); Assert.IsTrue(hc.UseReflectionOptimizer); Assert.AreEqual("NHibernate.Test", hc.SessionFactory.Name); @@ -49,7 +49,7 @@ public void ByteCodeProvider() [Test] public void IgnoreSystemOutOfAppConfig() { - IHibernateConfiguration hc = Cfg.Settings.ConfigurationManager.GetConfiguration(); + IHibernateConfiguration hc = Cfg.Settings.ConfigurationProvider.GetConfiguration(); string xml = @" diff --git a/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs index dd4df3b2540..ec146e6e0cd 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs @@ -31,7 +31,7 @@ private string FetchConnectionStringFromConfiguration() string connectionStringName; if (cfg.Properties.TryGetValue(Environment.ConnectionStringName, out connectionStringName)) { - connectionString = Cfg.Settings.ConfigurationManager.GetNamedConnectionString(connectionStringName); + connectionString = Cfg.Settings.ConfigurationProvider.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 773529c47f7..d0805d9ad2e 100644 --- a/src/NHibernate.Test/TestsContext.cs +++ b/src/NHibernate.Test/TestsContext.cs @@ -22,7 +22,7 @@ public void RunBeforeAnyTests() if (ExecutingWithVsTest) { var assemblyPath = Path.Combine(TestContext.CurrentContext.TestDirectory, Path.GetFileName(typeof(TestsContext).Assembly.Location)); - Settings.ConfigurationManager = new SystemConfigurationManager(ConfigurationManager.OpenExeConfiguration(assemblyPath)); + Settings.ConfigurationProvider = new SystemConfigurationProvider(ConfigurationManager.OpenExeConfiguration(assemblyPath)); } ConfigureLog4Net(); diff --git a/src/NHibernate/Cfg/Environment.cs b/src/NHibernate/Cfg/Environment.cs index 85ef83d476a..9cfa716fc7d 100644 --- a/src/NHibernate/Cfg/Environment.cs +++ b/src/NHibernate/Cfg/Environment.cs @@ -369,7 +369,7 @@ public static void InitializeGlobalProperties(IHibernateConfiguration config) private static IHibernateConfiguration GetHibernateConfiguration() { - var nhConfig = Settings.ConfigurationManager.GetConfiguration(); + var nhConfig = Settings.ConfigurationProvider.GetConfiguration(); if (nhConfig == null && log.IsInfoEnabled()) { log.Info("{0} section not found in application configuration file", CfgXmlHelper.CfgSectionName); diff --git a/src/NHibernate/Cfg/NullConfigurationManager.cs b/src/NHibernate/Cfg/NullConfigurationManager.cs index 2af1007a9a7..7954d738ddf 100644 --- a/src/NHibernate/Cfg/NullConfigurationManager.cs +++ b/src/NHibernate/Cfg/NullConfigurationManager.cs @@ -1,6 +1,6 @@ namespace NHibernate.Cfg { - class NullConfigurationManager : ConfigurationProvider + class NullConfigurationProvider : ConfigurationProvider { public override IHibernateConfiguration GetConfiguration() { diff --git a/src/NHibernate/Cfg/Settings.cs b/src/NHibernate/Cfg/Settings.cs index 9ab3c783ae9..112673cc80b 100644 --- a/src/NHibernate/Cfg/Settings.cs +++ b/src/NHibernate/Cfg/Settings.cs @@ -18,16 +18,16 @@ namespace NHibernate.Cfg /// public sealed class Settings { - private static ConfigurationProvider _configurationManager = new StaticSystemConfigurationManager(); + private static ConfigurationProvider _configurationProvider = 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 ConfigurationManager + public static ConfigurationProvider ConfigurationProvider { - get => _configurationManager; - set => _configurationManager = value ?? new NullConfigurationManager(); + get => _configurationProvider; + set => _configurationProvider = value ?? new NullConfigurationProvider(); } public Settings() diff --git a/src/NHibernate/Cfg/StaticSystemConfigurationManager.cs b/src/NHibernate/Cfg/StaticConfigurationManagerProvider.cs similarity index 94% rename from src/NHibernate/Cfg/StaticSystemConfigurationManager.cs rename to src/NHibernate/Cfg/StaticConfigurationManagerProvider.cs index 4ee020d5db3..8bc4abaa2d8 100644 --- a/src/NHibernate/Cfg/StaticSystemConfigurationManager.cs +++ b/src/NHibernate/Cfg/StaticConfigurationManagerProvider.cs @@ -5,7 +5,7 @@ namespace NHibernate.Cfg { - class StaticSystemConfigurationManager : ConfigurationProvider + class StaticConfigurationManagerProvider : ConfigurationProvider { public override IHibernateConfiguration GetConfiguration() { diff --git a/src/NHibernate/Cfg/SystemConfigurationManager.cs b/src/NHibernate/Cfg/SystemConfigurationManager.cs index 367481a9c92..87499d3cff8 100644 --- a/src/NHibernate/Cfg/SystemConfigurationManager.cs +++ b/src/NHibernate/Cfg/SystemConfigurationManager.cs @@ -6,11 +6,11 @@ namespace NHibernate.Cfg /// /// Configuration manager that supports user provided configuration /// - public class SystemConfigurationManager : ConfigurationProvider + public class SystemConfigurationProvider : ConfigurationProvider { private readonly System.Configuration.Configuration _configuration; - public SystemConfigurationManager(System.Configuration.Configuration configuration) + public SystemConfigurationProvider(System.Configuration.Configuration configuration) { _configuration = configuration; } diff --git a/src/NHibernate/Connection/ConnectionProvider.cs b/src/NHibernate/Connection/ConnectionProvider.cs index a38e249179d..62cfb410f26 100644 --- a/src/NHibernate/Connection/ConnectionProvider.cs +++ b/src/NHibernate/Connection/ConnectionProvider.cs @@ -76,7 +76,7 @@ protected virtual string GetNamedConnectionString(IDictionary se if(!settings.TryGetValue(Environment.ConnectionStringName, out connStringName)) return null; - var connectionString = Cfg.Settings.ConfigurationManager.GetNamedConnectionString(connStringName) + var connectionString = Cfg.Settings.ConfigurationProvider.GetNamedConnectionString(connStringName) ?? throw new HibernateException(string.Format("Could not find named connection string {0}", connStringName)); return connectionString; } diff --git a/src/NHibernate/Logging.cs b/src/NHibernate/Logging.cs index f781948bda0..da05e8adc6f 100644 --- a/src/NHibernate/Logging.cs +++ b/src/NHibernate/Logging.cs @@ -133,7 +133,7 @@ public static INHibernateLogger For(System.Type type) private static string GetNhibernateLoggerClass() { - var nhibernateLoggerClass = Settings.ConfigurationManager.GetLoggerFactoryClassName(); + var nhibernateLoggerClass = Settings.ConfigurationProvider.GetLoggerFactoryClassName(); if (nhibernateLoggerClass == null) { // look for log4net From 1878f4950bcb0809825142dffe54038a52ac9952 Mon Sep 17 00:00:00 2001 From: Alexander Zaytsev Date: Fri, 4 Oct 2019 17:02:07 +1300 Subject: [PATCH 09/11] Revert unnecessary changes --- src/NHibernate/Async/Connection/ConnectionProvider.cs | 1 + src/NHibernate/Connection/ConnectionProvider.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/NHibernate/Async/Connection/ConnectionProvider.cs b/src/NHibernate/Async/Connection/ConnectionProvider.cs index 3d04b34668b..72638e38277 100644 --- a/src/NHibernate/Async/Connection/ConnectionProvider.cs +++ b/src/NHibernate/Async/Connection/ConnectionProvider.cs @@ -10,6 +10,7 @@ using System; using System.Collections; +using System.Configuration; using System.Data.Common; using NHibernate.Driver; diff --git a/src/NHibernate/Connection/ConnectionProvider.cs b/src/NHibernate/Connection/ConnectionProvider.cs index a49012c1262..de244c75b08 100644 --- a/src/NHibernate/Connection/ConnectionProvider.cs +++ b/src/NHibernate/Connection/ConnectionProvider.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Configuration; using System.Data.Common; using NHibernate.Driver; From 766c007f8bfbd77ac20a8ee3a38e1c692161e9f0 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Fri, 4 Oct 2019 08:01:28 +0300 Subject: [PATCH 10/11] Clean up --- src/NHibernate/Async/Connection/ConnectionProvider.cs | 1 - src/NHibernate/Cfg/Environment.cs | 2 -- ...NullConfigurationManager.cs => NullConfigurationProvider.cs} | 0 ...emConfigurationManager.cs => SystemConfigurationProvider.cs} | 0 src/NHibernate/Connection/ConnectionProvider.cs | 1 - 5 files changed, 4 deletions(-) rename src/NHibernate/Cfg/{NullConfigurationManager.cs => NullConfigurationProvider.cs} (100%) rename src/NHibernate/Cfg/{SystemConfigurationManager.cs => SystemConfigurationProvider.cs} (100%) 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/Environment.cs b/src/NHibernate/Cfg/Environment.cs index eb99a1019f8..17b9d683df3 100644 --- a/src/NHibernate/Cfg/Environment.cs +++ b/src/NHibernate/Cfg/Environment.cs @@ -556,7 +556,6 @@ private static IObjectsFactory CreateCustomObjectsFactory(string assemblyQualifi } } - /// /// Get a named connection string, if configured. /// @@ -573,7 +572,6 @@ internal static string GetNamedConnectionString(IDictionary sett ?? 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/NullConfigurationManager.cs b/src/NHibernate/Cfg/NullConfigurationProvider.cs similarity index 100% rename from src/NHibernate/Cfg/NullConfigurationManager.cs rename to src/NHibernate/Cfg/NullConfigurationProvider.cs diff --git a/src/NHibernate/Cfg/SystemConfigurationManager.cs b/src/NHibernate/Cfg/SystemConfigurationProvider.cs similarity index 100% rename from src/NHibernate/Cfg/SystemConfigurationManager.cs rename to src/NHibernate/Cfg/SystemConfigurationProvider.cs 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; From 3873b2511b638753fa1b7f8e68c765e642aa0ae0 Mon Sep 17 00:00:00 2001 From: Alexander Zaytsev Date: Wed, 16 Oct 2019 18:19:58 +1300 Subject: [PATCH 11/11] Move static ConfigurationProvider from Settings to itself. --- .../Async/NHSpecificTest/NH2420/Fixture.cs | 3 ++- .../CfgTest/ConfigurationSchemaFixture.cs | 4 ++-- .../NHSpecificTest/NH2420/Fixture.cs | 3 ++- src/NHibernate.Test/TestsContext.cs | 2 +- src/NHibernate/Cfg/ConfigurationProvider.cs | 13 +++++++++++++ src/NHibernate/Cfg/Environment.cs | 4 ++-- src/NHibernate/Cfg/Settings.cs | 12 ------------ src/NHibernate/Logging.cs | 2 +- 8 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs index e59a3931dfc..e8a03ec6118 100644 --- a/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs +++ b/src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs @@ -12,6 +12,7 @@ using System.Data.Odbc; using System.Data.SqlClient; using System.Transactions; +using NHibernate.Cfg; using NHibernate.Dialect; using NHibernate.Driver; using NHibernate.Engine; @@ -42,7 +43,7 @@ private string FetchConnectionStringFromConfiguration() string connectionStringName; if (cfg.Properties.TryGetValue(Environment.ConnectionStringName, out connectionStringName)) { - connectionString = Cfg.Settings.ConfigurationProvider.GetNamedConnectionString(connectionStringName); + 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 52b4acdf2f0..52c3f7b02de 100644 --- a/src/NHibernate.Test/CfgTest/ConfigurationSchemaFixture.cs +++ b/src/NHibernate.Test/CfgTest/ConfigurationSchemaFixture.cs @@ -25,7 +25,7 @@ public void SessionFactoryIsRequiredWhenConfigurationIsNotLoadedFromAppConfig() [Test] public void FromAppConfigTest() { - IHibernateConfiguration hc = Cfg.Settings.ConfigurationProvider.GetConfiguration(); + IHibernateConfiguration hc = ConfigurationProvider.Current.GetConfiguration(); Assert.That(hc.ByteCodeProviderType, Is.EqualTo("lcg")); Assert.IsTrue(hc.UseReflectionOptimizer); Assert.AreEqual("NHibernate.Test", hc.SessionFactory.Name); @@ -49,7 +49,7 @@ public void ByteCodeProvider() [Test] public void IgnoreSystemOutOfAppConfig() { - IHibernateConfiguration hc = Cfg.Settings.ConfigurationProvider.GetConfiguration(); + IHibernateConfiguration hc = ConfigurationProvider.Current.GetConfiguration(); string xml = @" diff --git a/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs index ec146e6e0cd..03f470f2443 100644 --- a/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs +++ b/src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs @@ -2,6 +2,7 @@ using System.Data.Odbc; using System.Data.SqlClient; using System.Transactions; +using NHibernate.Cfg; using NHibernate.Dialect; using NHibernate.Driver; using NHibernate.Engine; @@ -31,7 +32,7 @@ private string FetchConnectionStringFromConfiguration() string connectionStringName; if (cfg.Properties.TryGetValue(Environment.ConnectionStringName, out connectionStringName)) { - connectionString = Cfg.Settings.ConfigurationProvider.GetNamedConnectionString(connectionStringName); + 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 d0805d9ad2e..4eae9d561e5 100644 --- a/src/NHibernate.Test/TestsContext.cs +++ b/src/NHibernate.Test/TestsContext.cs @@ -22,7 +22,7 @@ public void RunBeforeAnyTests() if (ExecutingWithVsTest) { var assemblyPath = Path.Combine(TestContext.CurrentContext.TestDirectory, Path.GetFileName(typeof(TestsContext).Assembly.Location)); - Settings.ConfigurationProvider = new SystemConfigurationProvider(ConfigurationManager.OpenExeConfiguration(assemblyPath)); + ConfigurationProvider.Current = new SystemConfigurationProvider(ConfigurationManager.OpenExeConfiguration(assemblyPath)); } ConfigureLog4Net(); diff --git a/src/NHibernate/Cfg/ConfigurationProvider.cs b/src/NHibernate/Cfg/ConfigurationProvider.cs index f474b5ab765..d793e906ee8 100644 --- a/src/NHibernate/Cfg/ConfigurationProvider.cs +++ b/src/NHibernate/Cfg/ConfigurationProvider.cs @@ -5,7 +5,20 @@ namespace NHibernate.Cfg /// 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); /// diff --git a/src/NHibernate/Cfg/Environment.cs b/src/NHibernate/Cfg/Environment.cs index 17b9d683df3..6613fe0fd2e 100644 --- a/src/NHibernate/Cfg/Environment.cs +++ b/src/NHibernate/Cfg/Environment.cs @@ -381,7 +381,7 @@ public static void InitializeGlobalProperties(IHibernateConfiguration config) private static IHibernateConfiguration GetHibernateConfiguration() { - var nhConfig = Settings.ConfigurationProvider.GetConfiguration(); + var nhConfig = ConfigurationProvider.Current.GetConfiguration(); if (nhConfig == null && log.IsInfoEnabled()) { log.Info("{0} section not found in application configuration file", CfgXmlHelper.CfgSectionName); @@ -568,7 +568,7 @@ internal static string GetNamedConnectionString(IDictionary sett if (!settings.TryGetValue(ConnectionStringName, out var connStringName)) return null; - return Settings.ConfigurationProvider.GetNamedConnectionString(connStringName) + return ConfigurationProvider.Current.GetNamedConnectionString(connStringName) ?? throw new HibernateException($"Could not find named connection string '{connStringName}'."); } diff --git a/src/NHibernate/Cfg/Settings.cs b/src/NHibernate/Cfg/Settings.cs index 112673cc80b..4d4fc1fa96e 100644 --- a/src/NHibernate/Cfg/Settings.cs +++ b/src/NHibernate/Cfg/Settings.cs @@ -18,18 +18,6 @@ namespace NHibernate.Cfg /// public sealed class Settings { - private static ConfigurationProvider _configurationProvider = 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 ConfigurationProvider - { - get => _configurationProvider; - set => _configurationProvider = value ?? new NullConfigurationProvider(); - } - public Settings() { MaximumFetchDepth = -1; diff --git a/src/NHibernate/Logging.cs b/src/NHibernate/Logging.cs index da05e8adc6f..2039c18abb6 100644 --- a/src/NHibernate/Logging.cs +++ b/src/NHibernate/Logging.cs @@ -133,7 +133,7 @@ public static INHibernateLogger For(System.Type type) private static string GetNhibernateLoggerClass() { - var nhibernateLoggerClass = Settings.ConfigurationProvider.GetLoggerFactoryClassName(); + var nhibernateLoggerClass = ConfigurationProvider.Current.GetLoggerFactoryClassName(); if (nhibernateLoggerClass == null) { // look for log4net