Skip to content

Commit c8dcb96

Browse files
author
Sergey Komisarchik
authored
Merge pull request #151 from tsimbalar/fix/unskip-test
No longer rely on static state in ConfigurationReader
2 parents 71ee59d + 00178a1 commit c8dcb96

17 files changed

+346
-230
lines changed

src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
using Microsoft.Extensions.DependencyModel;
1818
using Serilog.Configuration;
1919
using Serilog.Settings.Configuration;
20-
using System.Reflection;
20+
using Serilog.Settings.Configuration.Assemblies;
2121

2222
namespace Serilog
2323
{
@@ -48,10 +48,15 @@ public static LoggerConfiguration Configuration(
4848
{
4949
if (configuration == null) throw new ArgumentNullException(nameof(configuration));
5050

51+
var assemblyFinder = dependencyContext == null
52+
? AssemblyFinder.Auto()
53+
: AssemblyFinder.ForDependencyContext(dependencyContext);
54+
5155
return settingConfiguration.Settings(
5256
new ConfigurationReader(
53-
configuration,
54-
dependencyContext ?? (Assembly.GetEntryAssembly() != null ? DependencyContext.Default : null)));
57+
configuration.GetSection(DefaultSectionName),
58+
assemblyFinder,
59+
configuration));
5560
}
5661

5762
/// <summary>
@@ -71,10 +76,15 @@ public static LoggerConfiguration ConfigurationSection(
7176
if (settingConfiguration == null) throw new ArgumentNullException(nameof(settingConfiguration));
7277
if (configSection == null) throw new ArgumentNullException(nameof(configSection));
7378

79+
var assemblyFinder = dependencyContext == null
80+
? AssemblyFinder.Auto()
81+
: AssemblyFinder.ForDependencyContext(dependencyContext);
82+
7483
return settingConfiguration.Settings(
7584
new ConfigurationReader(
7685
configSection,
77-
dependencyContext ?? (Assembly.GetEntryAssembly() != null ? DependencyContext.Default : null)));
86+
assemblyFinder,
87+
configuration: null));
7888
}
7989

8090
/// <summary>
@@ -93,14 +103,9 @@ public static LoggerConfiguration Configuration(
93103
{
94104
if (configuration == null) throw new ArgumentNullException(nameof(configuration));
95105

96-
if(configurationAssemblySource == ConfigurationAssemblySource.UseLoadedAssemblies)
97-
{
98-
return Configuration(settingConfiguration, configuration);
99-
}
100-
else
101-
{
102-
return settingConfiguration.Settings(new ConfigurationReader(configuration, null));
103-
}
106+
var assemblyFinder = AssemblyFinder.ForSource(configurationAssemblySource);
107+
108+
return settingConfiguration.Settings(new ConfigurationReader(configuration.GetSection(DefaultSectionName), assemblyFinder, configuration));
104109
}
105110

106111
/// <summary>
@@ -119,14 +124,9 @@ public static LoggerConfiguration ConfigurationSection(
119124
if (settingConfiguration == null) throw new ArgumentNullException(nameof(settingConfiguration));
120125
if (configSection == null) throw new ArgumentNullException(nameof(configSection));
121126

122-
if (configurationAssemblySource == ConfigurationAssemblySource.UseLoadedAssemblies)
123-
{
124-
return Configuration(settingConfiguration, configSection);
125-
}
126-
else
127-
{
128-
return settingConfiguration.Settings(new ConfigurationReader(configSection, null));
129-
}
127+
var assemblyFinder = AssemblyFinder.ForSource(configurationAssemblySource);
128+
129+
return settingConfiguration.Settings(new ConfigurationReader(configSection, assemblyFinder, configuration: null));
130130
}
131131
}
132132
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Reflection;
4+
using Microsoft.Extensions.DependencyModel;
5+
6+
namespace Serilog.Settings.Configuration.Assemblies
7+
{
8+
abstract class AssemblyFinder
9+
{
10+
public abstract IReadOnlyList<AssemblyName> FindAssembliesContainingName(string nameToFind);
11+
12+
protected static bool IsCaseInsensitiveMatch(string text, string textToFind)
13+
{
14+
return text != null && text.ToLowerInvariant().Contains(textToFind.ToLowerInvariant());
15+
}
16+
17+
public static AssemblyFinder Auto()
18+
{
19+
// Need to check `Assembly.GetEntryAssembly()` first because
20+
// `DependencyContext.Default` throws an exception when `Assembly.GetEntryAssembly()` returns null
21+
if (Assembly.GetEntryAssembly() != null && DependencyContext.Default != null)
22+
{
23+
return new DependencyContextAssemblyFinder(DependencyContext.Default);
24+
}
25+
return new DllScanningAssemblyFinder();
26+
}
27+
28+
public static AssemblyFinder ForSource(ConfigurationAssemblySource configurationAssemblySource)
29+
{
30+
switch (configurationAssemblySource)
31+
{
32+
case ConfigurationAssemblySource.UseLoadedAssemblies:
33+
return Auto();
34+
case ConfigurationAssemblySource.AlwaysScanDllFiles:
35+
return new DllScanningAssemblyFinder();
36+
default:
37+
throw new ArgumentOutOfRangeException(nameof(configurationAssemblySource), configurationAssemblySource, null);
38+
}
39+
}
40+
41+
public static AssemblyFinder ForDependencyContext(DependencyContext dependencyContext)
42+
{
43+
return new DependencyContextAssemblyFinder(dependencyContext);
44+
}
45+
}
46+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Reflection;
5+
using Microsoft.Extensions.DependencyModel;
6+
7+
namespace Serilog.Settings.Configuration.Assemblies
8+
{
9+
sealed class DependencyContextAssemblyFinder : AssemblyFinder
10+
{
11+
readonly DependencyContext _dependencyContext;
12+
13+
public DependencyContextAssemblyFinder(DependencyContext dependencyContext)
14+
{
15+
_dependencyContext = dependencyContext ?? throw new ArgumentNullException(nameof(dependencyContext));
16+
}
17+
18+
public override IReadOnlyList<AssemblyName> FindAssembliesContainingName(string nameToFind)
19+
{
20+
var query = from library in _dependencyContext.RuntimeLibraries
21+
from assemblyName in library.GetDefaultAssemblyNames(_dependencyContext)
22+
where IsCaseInsensitiveMatch(assemblyName.Name, nameToFind)
23+
select assemblyName;
24+
25+
return query.ToList().AsReadOnly();
26+
}
27+
}
28+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Reflection;
5+
6+
namespace Serilog.Settings.Configuration.Assemblies
7+
{
8+
sealed class DllScanningAssemblyFinder : AssemblyFinder
9+
{
10+
public override IReadOnlyList<AssemblyName> FindAssembliesContainingName(string nameToFind)
11+
{
12+
var query = from outputAssemblyPath in System.IO.Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll")
13+
let assemblyFileName = System.IO.Path.GetFileNameWithoutExtension(outputAssemblyPath)
14+
where IsCaseInsensitiveMatch(assemblyFileName, nameToFind)
15+
select AssemblyName.GetAssemblyName(outputAssemblyPath);
16+
17+
return query.ToList().AsReadOnly();
18+
}
19+
}
20+
}

0 commit comments

Comments
 (0)