Skip to content

Commit 4a206d2

Browse files
committed
Ability to replace ConfigurationManager with custom configuration provider
1 parent 151194f commit 4a206d2

File tree

12 files changed

+89
-78
lines changed

12 files changed

+89
-78
lines changed

src/NHibernate.Test/Async/NHSpecificTest/NH2420/Fixture.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
using System.Data.Common;
1212
using System.Data.Odbc;
1313
using System.Data.SqlClient;
14-
using System.Configuration;
1514
using System.Transactions;
1615
using NHibernate.Dialect;
1716
using NHibernate.Driver;
@@ -43,9 +42,7 @@ private string FetchConnectionStringFromConfiguration()
4342
string connectionStringName;
4443
if (cfg.Properties.TryGetValue(Environment.ConnectionStringName, out connectionStringName))
4544
{
46-
var connectionStringSettings = ConfigurationManager.ConnectionStrings[connectionStringName];
47-
Assert.That(connectionStringSettings, Is.Not.Null);
48-
connectionString = connectionStringSettings.ConnectionString;
45+
connectionString = Cfg.Settings.ConfigurationManager.GetNamedConnectionString(connectionStringName);
4946
Assert.That(connectionString, Is.Not.Null.Or.Empty);
5047
return connectionString;
5148
}

src/NHibernate.Test/CfgTest/ConfigurationSchemaFixture.cs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System.Configuration;
21
using NHibernate.Event;
32
using NUnit.Framework;
43
using NHibernate.Cfg;
@@ -26,9 +25,7 @@ public void SessionFactoryIsRequiredWhenConfigurationIsNotLoadedFromAppConfig()
2625
[Test]
2726
public void FromAppConfigTest()
2827
{
29-
Assume.That(TestsContext.ExecutingWithVsTest, Is.False);
30-
31-
IHibernateConfiguration hc = ConfigurationManager.GetSection("hibernate-configuration") as IHibernateConfiguration;
28+
IHibernateConfiguration hc = Cfg.Settings.ConfigurationManager.GetConfiguration();
3229
Assert.That(hc.ByteCodeProviderType, Is.EqualTo("lcg"));
3330
Assert.IsTrue(hc.UseReflectionOptimizer);
3431
Assert.AreEqual("NHibernate.Test", hc.SessionFactory.Name);
@@ -37,8 +34,6 @@ public void FromAppConfigTest()
3734
[Test]
3835
public void ByteCodeProvider()
3936
{
40-
Assume.That(TestsContext.ExecutingWithVsTest, Is.False);
41-
4237
var xml =
4338
@"<?xml version='1.0' encoding='utf-8' ?>
4439
<hibernate-configuration xmlns='urn:nhibernate-configuration-2.2'>
@@ -54,9 +49,7 @@ public void ByteCodeProvider()
5449
[Test]
5550
public void IgnoreSystemOutOfAppConfig()
5651
{
57-
Assume.That(TestsContext.ExecutingWithVsTest, Is.False);
58-
59-
IHibernateConfiguration hc = ConfigurationManager.GetSection("hibernate-configuration") as IHibernateConfiguration;
52+
IHibernateConfiguration hc = Cfg.Settings.ConfigurationManager.GetConfiguration();
6053
string xml =
6154
@"<?xml version='1.0' encoding='utf-8' ?>
6255
<hibernate-configuration xmlns='urn:nhibernate-configuration-2.2'>
@@ -75,8 +68,6 @@ public void IgnoreSystemOutOfAppConfig()
7568
[Test]
7669
public void ObjectsFactory()
7770
{
78-
Assume.That(TestsContext.ExecutingWithVsTest, Is.False);
79-
8071
var xml =
8172
@"<?xml version='1.0' encoding='utf-8' ?>
8273
<hibernate-configuration xmlns='urn:nhibernate-configuration-2.2'>

src/NHibernate.Test/ConnectionStringTest/NamedConnectionStringFixture.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ public void ConnectionStringInSettingsOverrideNamedConnectionSTring()
3535
[Test]
3636
public void CanGetNamedConnectionStringFromConfiguration()
3737
{
38-
Assume.That(TestsContext.ExecutingWithVsTest, Is.False);
39-
4038
Dictionary<string, string> settings = new Dictionary<string, string>();
4139
settings.Add(Environment.ConnectionStringName, "DummyConnectionString");
4240
MockConnectionProvider cp = new MockConnectionProvider();

src/NHibernate.Test/Logging/LoggerProviderTest.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,13 @@ public void LoggerProviderCanCreateLoggers_Obsolete()
2424
[Test]
2525
public void WhenNotConfiguredAndLog4NetExistsThenUseLog4NetFactory()
2626
{
27-
Assume.That(TestsContext.ExecutingWithVsTest, Is.False);
28-
2927
// NoLoggingNHibernateLogger is internal
3028
Assert.That(NHibernateLogger.For("pizza").GetType().Name, Is.Not.EqualTo("NoLoggingNHibernateLogger"));
3129
}
3230

3331
[Test, Obsolete]
3432
public void WhenNotConfiguredAndLog4NetExistsThenUseLog4NetFactory_Obsolete()
3533
{
36-
Assume.That(TestsContext.ExecutingWithVsTest, Is.False);
37-
3834
Assert.That(LoggerProvider.LoggerFor("pizza"), Is.Not.InstanceOf<NoLoggingInternalLogger>());
3935

4036
// works because this is the legacy provider with a legacy logger

src/NHibernate.Test/NHSpecificTest/NH2420/Fixture.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System.Data.Common;
22
using System.Data.Odbc;
33
using System.Data.SqlClient;
4-
using System.Configuration;
54
using System.Transactions;
65
using NHibernate.Dialect;
76
using NHibernate.Driver;
@@ -32,9 +31,7 @@ private string FetchConnectionStringFromConfiguration()
3231
string connectionStringName;
3332
if (cfg.Properties.TryGetValue(Environment.ConnectionStringName, out connectionStringName))
3433
{
35-
var connectionStringSettings = ConfigurationManager.ConnectionStrings[connectionStringName];
36-
Assert.That(connectionStringSettings, Is.Not.Null);
37-
connectionString = connectionStringSettings.ConnectionString;
34+
connectionString = Cfg.Settings.ConfigurationManager.GetNamedConnectionString(connectionStringName);
3835
Assert.That(connectionString, Is.Not.Null.Or.Empty);
3936
return connectionString;
4037
}

src/NHibernate.Test/TestsContext.cs

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
#if NETCOREAPP2_0
44
using System.Configuration;
55
using System.IO;
6-
using log4net.Repository.Hierarchy;
76
using NHibernate.Cfg;
87
using NHibernate.Cfg.ConfigurationSchema;
98
#endif
@@ -15,7 +14,7 @@ namespace NHibernate.Test
1514
#endif
1615
public class TestsContext
1716
{
18-
public static bool ExecutingWithVsTest { get; } =
17+
private static bool ExecutingWithVsTest { get; } =
1918
System.Reflection.Assembly.GetEntryAssembly()?.GetName().Name == "testhost";
2019

2120
#if NETCOREAPP2_0
@@ -26,37 +25,37 @@ public void RunBeforeAnyTests()
2625
//so we need to explicitly load the configuration
2726
if (ExecutingWithVsTest)
2827
{
29-
Environment.InitializeGlobalProperties(GetTestAssemblyHibernateConfiguration());
28+
Settings.ConfigurationManager = new NetCoreConfigurationManager();
3029
}
31-
32-
ConfigureLog4Net();
3330
}
3431

35-
public static IHibernateConfiguration GetTestAssemblyHibernateConfiguration()
32+
class NetCoreConfigurationManager : IConfigurationManager
3633
{
37-
var assemblyPath =
38-
Path.Combine(TestContext.CurrentContext.TestDirectory, Path.GetFileName(typeof(TestsContext).Assembly.Location));
39-
var configuration = ConfigurationManager.OpenExeConfiguration(assemblyPath);
40-
var section = configuration.GetSection(CfgXmlHelper.CfgSectionName);
41-
return HibernateConfiguration.FromAppConfig(section.SectionInformation.GetRawXml());
42-
}
34+
private readonly System.Configuration.Configuration _configuration;
4335

44-
private static void ConfigureLog4Net()
45-
{
46-
var hierarchy = (Hierarchy)log4net.LogManager.GetRepository(typeof(TestsContext).Assembly);
36+
public NetCoreConfigurationManager()
37+
{
38+
var assemblyPath =
39+
Path.Combine(TestContext.CurrentContext.TestDirectory, Path.GetFileName(typeof(TestsContext).Assembly.Location));
40+
_configuration = ConfigurationManager.OpenExeConfiguration(assemblyPath);
41+
}
42+
43+
public IHibernateConfiguration GetConfiguration()
44+
{
45+
ConfigurationSection configurationSection = _configuration.GetSection(CfgXmlHelper.CfgSectionName);
46+
var xml = configurationSection?.SectionInformation.GetRawXml();
47+
return xml == null ? null : HibernateConfiguration.FromAppConfig(xml);
48+
}
4749

48-
var consoleAppender = new log4net.Appender.ConsoleAppender
50+
public string GetNamedConnectionString(string name)
4951
{
50-
Layout = new log4net.Layout.PatternLayout("%d{ABSOLUTE} %-5p %c{1}:%L - %m%n"),
51-
};
52+
return _configuration.ConnectionStrings.ConnectionStrings[name]?.ConnectionString;
53+
}
5254

53-
((Logger)hierarchy.GetLogger("NHibernate.Hql.Ast.ANTLR")).Level = log4net.Core.Level.Off;
54-
((Logger)hierarchy.GetLogger("NHibernate.SQL")).Level = log4net.Core.Level.Off;
55-
((Logger)hierarchy.GetLogger("NHibernate.AdoNet.AbstractBatcher")).Level = log4net.Core.Level.Off;
56-
((Logger)hierarchy.GetLogger("NHibernate.Tool.hbm2ddl.SchemaExport")).Level = log4net.Core.Level.Error;
57-
hierarchy.Root.Level = log4net.Core.Level.Warn;
58-
hierarchy.Root.AddAppender(consoleAppender);
59-
hierarchy.Configured = true;
55+
public string GetAppSetting(string name)
56+
{
57+
return _configuration.AppSettings.Settings[name]?.Value;
58+
}
6059
}
6160
#endif
6261
}

src/NHibernate/Async/Connection/ConnectionProvider.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
using System;
1212
using System.Collections;
13-
using System.Configuration;
1413
using System.Data.Common;
1514

1615
using NHibernate.Driver;

src/NHibernate/Cfg/Environment.cs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Configuration;
43
using System.Reflection;
54

65
using NHibernate.Bytecode;
@@ -358,19 +357,10 @@ public static void InitializeGlobalProperties(IHibernateConfiguration config)
358357

359358
private static IHibernateConfiguration GetHibernateConfiguration()
360359
{
361-
object config = ConfigurationManager.GetSection(CfgXmlHelper.CfgSectionName);
362-
if (config == null)
360+
var nhConfig = Settings.ConfigurationManager.GetConfiguration();;
361+
if (log.IsInfoEnabled() && nhConfig == null)
363362
{
364363
log.Info("{0} section not found in application configuration file", CfgXmlHelper.CfgSectionName);
365-
return null;
366-
}
367-
368-
var nhConfig = config as IHibernateConfiguration;
369-
if (nhConfig == null)
370-
{
371-
log.Info(
372-
"{0} section handler, in application configuration file, is not IHibernateConfiguration, section ignored",
373-
CfgXmlHelper.CfgSectionName);
374364
}
375365

376366
return nhConfig;
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using System;
2+
using System.Configuration;
3+
using System.Linq;
4+
5+
namespace NHibernate.Cfg
6+
{
7+
internal static class ConfigurationManagerExtensions
8+
{
9+
//TODO 6.0: Replace with GetAppSetting and document as possible breaking change all usages.
10+
internal static string GetAppSettingIgnoringCase(this IConfigurationManager config, string name)
11+
{
12+
if (!(config is SystemConfigurationManager))
13+
return config.GetAppSetting(name);
14+
15+
var key = ConfigurationManager.AppSettings.Keys.Cast<string>().FirstOrDefault(k => name.Equals(k, StringComparison.OrdinalIgnoreCase));
16+
return string.IsNullOrEmpty(key)
17+
? null
18+
: ConfigurationManager.AppSettings[key];
19+
}
20+
}
21+
22+
public interface IConfigurationManager
23+
{
24+
IHibernateConfiguration GetConfiguration();
25+
string GetNamedConnectionString(string name);
26+
string GetAppSetting(string name);
27+
}
28+
29+
class SystemConfigurationManager : IConfigurationManager
30+
{
31+
public IHibernateConfiguration GetConfiguration()
32+
{
33+
//TODO 6.0: Throw if not null and not IHibernateConfiguration
34+
return ConfigurationManager.GetSection(ConfigurationSchema.CfgXmlHelper.CfgSectionName) as IHibernateConfiguration;
35+
}
36+
37+
public string GetNamedConnectionString(string name)
38+
{
39+
return ConfigurationManager.ConnectionStrings[name]?.ConnectionString;
40+
}
41+
42+
public string GetAppSetting(string name)
43+
{
44+
return ConfigurationManager.AppSettings[name];
45+
}
46+
}
47+
}

src/NHibernate/Cfg/Settings.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ namespace NHibernate.Cfg
1818
/// </summary>
1919
public sealed class Settings
2020
{
21+
/// <summary>
22+
/// Provides ability to override default <see cref="System.Configuration.ConfigurationManager"/> with custom implementation.
23+
/// </summary>
24+
public static IConfigurationManager ConfigurationManager { get; set; } = new SystemConfigurationManager();
25+
2126
public Settings()
2227
{
2328
MaximumFetchDepth = -1;
@@ -146,4 +151,4 @@ internal string GetFullCacheRegionName(string name)
146151
return name;
147152
}
148153
}
149-
}
154+
}

src/NHibernate/Connection/ConnectionProvider.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Collections;
3-
using System.Configuration;
43
using System.Data.Common;
54

65
using NHibernate.Driver;
@@ -77,10 +76,9 @@ protected virtual string GetNamedConnectionString(IDictionary<string, string> se
7776
if(!settings.TryGetValue(Environment.ConnectionStringName, out connStringName))
7877
return null;
7978

80-
ConnectionStringSettings connectionStringSettings = ConfigurationManager.ConnectionStrings[connStringName];
81-
if (connectionStringSettings == null)
82-
throw new HibernateException(string.Format("Could not find named connection string {0}", connStringName));
83-
return connectionStringSettings.ConnectionString;
79+
var connectionString = Cfg.Settings.ConfigurationManager.GetNamedConnectionString(connStringName)
80+
?? throw new HibernateException(string.Format("Could not find named connection string {0}", connStringName));
81+
return connectionString;
8482
}
8583

8684
/// <summary>

src/NHibernate/Logging.cs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
2-
using System.Configuration;
3-
using System.Linq;
2+
using NHibernate.Cfg;
43

54
namespace NHibernate
65
{
@@ -112,20 +111,15 @@ public static INHibernateLogger For(System.Type type)
112111

113112
private static string GetNhibernateLoggerClass()
114113
{
115-
var nhibernateLogger = ConfigurationManager.AppSettings.Keys.Cast<string>().FirstOrDefault(k => nhibernateLoggerConfKey.Equals(k, StringComparison.OrdinalIgnoreCase));
116-
string nhibernateLoggerClass = null;
117-
if (string.IsNullOrEmpty(nhibernateLogger))
114+
var nhibernateLoggerClass = Settings.ConfigurationManager.GetAppSettingIgnoringCase(nhibernateLoggerConfKey);
115+
if (nhibernateLoggerClass == null)
118116
{
119117
// look for log4net
120118
if (Log4NetLoggerFactory.Log4NetAssembly != null)
121119
{
122120
nhibernateLoggerClass = typeof(Log4NetLoggerFactory).AssemblyQualifiedName;
123121
}
124122
}
125-
else
126-
{
127-
nhibernateLoggerClass = ConfigurationManager.AppSettings[nhibernateLogger];
128-
}
129123
return nhibernateLoggerClass;
130124
}
131125

0 commit comments

Comments
 (0)