Skip to content

Commit e4aff22

Browse files
committed
* Use factories in all configuration extensions to create sink and audit sink classes.
* Added some unit tests for hybrid configuration extensions.
1 parent 032ab1c commit e4aff22

File tree

12 files changed

+267
-122
lines changed

12 files changed

+267
-122
lines changed

src/Serilog.Sinks.MSSqlServer/Configuration/Extensions/Hybrid/LoggerConfigurationMSSqlServerExtensions.cs

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
using Serilog.Events;
2121
using Serilog.Formatting;
2222
using Serilog.Sinks.MSSqlServer;
23-
using Serilog.Sinks.MSSqlServer.Configuration.Extensions.Hybrid;
23+
using Serilog.Sinks.MSSqlServer.Configuration.Factories;
2424

2525
// The "Hybrid" configuration system supports both Microsoft.Extensions.Configuration and System.Configuration.
2626
// This is necessary because .NET Framework 4.6.1+ and .NET Core 2.0+ apps support both approaches, whereas the
@@ -90,7 +90,7 @@ public static LoggerConfiguration MSSqlServer(
9090
applyMicrosoftExtensionsConfiguration: new ApplyMicrosoftExtensionsConfiguration(),
9191
sinkFactory: new MSSqlServerSinkFactory());
9292

93-
// Internal overload with parameters applySystemConfiguration and applyMicrosoftExtensionsConfiguration used by tests to inject mocks
93+
// Internal overload with parameters used by tests to override the config section and inject mocks
9494
internal static LoggerConfiguration MSSqlServerInternal(
9595
this LoggerSinkConfiguration loggerConfiguration,
9696
string connectionString,
@@ -116,7 +116,8 @@ internal static LoggerConfiguration MSSqlServerInternal(
116116
var colOpts = columnOptions ?? new ColumnOptions();
117117
var connStr = connectionString;
118118

119-
if (ConfigurationManager.GetSection(AppConfigSectionName) is MSSqlServerConfigurationSection serviceConfigSection)
119+
var serviceConfigSection = applySystemConfiguration.GetSinkConfigurationSection(AppConfigSectionName);
120+
if (serviceConfigSection != null)
120121
{
121122
colOpts = applySystemConfiguration.ConfigureColumnOptions(serviceConfigSection, colOpts);
122123
connStr = applySystemConfiguration.GetConnectionString(connStr);
@@ -181,9 +182,10 @@ public static LoggerConfiguration MSSqlServer(
181182
schemaName: schemaName,
182183
logEventFormatter: logEventFormatter,
183184
applySystemConfiguration: new ApplySystemConfiguration(),
184-
applyMicrosoftExtensionsConfiguration: new ApplyMicrosoftExtensionsConfiguration());
185+
applyMicrosoftExtensionsConfiguration: new ApplyMicrosoftExtensionsConfiguration(),
186+
auditSinkFactory: new MSSqlServerAuditSinkFactory());
185187

186-
// Internal overload with parameters applySystemConfiguration and applyMicrosoftExtensionsConfiguration used by tests to inject mocks
188+
// Internal overload with parameters used by tests to override the config section and inject mocks
187189
internal static LoggerConfiguration MSSqlServerInternal(
188190
this LoggerAuditSinkConfiguration loggerAuditSinkConfiguration,
189191
string connectionString,
@@ -197,15 +199,17 @@ internal static LoggerConfiguration MSSqlServerInternal(
197199
string schemaName = "dbo",
198200
ITextFormatter logEventFormatter = null,
199201
IApplySystemConfiguration applySystemConfiguration = null,
200-
IApplyMicrosoftExtensionsConfiguration applyMicrosoftExtensionsConfiguration = null)
202+
IApplyMicrosoftExtensionsConfiguration applyMicrosoftExtensionsConfiguration = null,
203+
IMSSqlServerAuditSinkFactory auditSinkFactory = null)
201204
{
202205
if (loggerAuditSinkConfiguration == null)
203206
throw new ArgumentNullException(nameof(loggerAuditSinkConfiguration));
204207

205208
var colOpts = columnOptions ?? new ColumnOptions();
206209
var connStr = connectionString;
207210

208-
if (ConfigurationManager.GetSection(AppConfigSectionName) is MSSqlServerConfigurationSection serviceConfigSection)
211+
var serviceConfigSection = applySystemConfiguration.GetSinkConfigurationSection(AppConfigSectionName);
212+
if (serviceConfigSection != null)
209213
{
210214
colOpts = applySystemConfiguration.ConfigureColumnOptions(serviceConfigSection, colOpts);
211215
connStr = applySystemConfiguration.GetConnectionString(connStr);
@@ -224,16 +228,10 @@ internal static LoggerConfiguration MSSqlServerInternal(
224228
colOpts = applyMicrosoftExtensionsConfiguration.ConfigureColumnOptions(colOpts, columnOptionsSection);
225229
}
226230

227-
return loggerAuditSinkConfiguration.Sink(
228-
new MSSqlServerAuditSink(
229-
connStr,
230-
tableName,
231-
formatProvider,
232-
autoCreateSqlTable,
233-
colOpts,
234-
schemaName,
235-
logEventFormatter),
236-
restrictedToMinimumLevel);
231+
var auditSink = auditSinkFactory.Create(connStr, tableName, formatProvider, autoCreateSqlTable,
232+
colOpts, schemaName, logEventFormatter);
233+
234+
return loggerAuditSinkConfiguration.Sink(auditSink, restrictedToMinimumLevel);
237235
}
238236
}
239237
}

src/Serilog.Sinks.MSSqlServer/Configuration/Extensions/Microsoft.Extensions.Configuration/LoggerConfigurationMSSqlServerExtensions.cs

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using Serilog.Events;
1919
using Serilog.Formatting;
2020
using Serilog.Sinks.MSSqlServer;
21+
using Serilog.Sinks.MSSqlServer.Configuration.Factories;
2122

2223
// M.E.C. support for .NET Standard 2.0 libraries.
2324

@@ -69,22 +70,15 @@ public static LoggerConfiguration MSSqlServer(
6970

7071
var defaultedPeriod = period ?? MSSqlServerSink.DefaultPeriod;
7172

72-
var microsoftExtensionsConfiguration = new ApplyMicrosoftExtensionsConfiguration();
73+
IApplyMicrosoftExtensionsConfiguration microsoftExtensionsConfiguration = new ApplyMicrosoftExtensionsConfiguration();
7374
var connectionStr = microsoftExtensionsConfiguration.GetConnectionString(connectionString, appConfiguration);
7475
var colOpts = microsoftExtensionsConfiguration.ConfigureColumnOptions(columnOptions, columnOptionsSection);
7576

76-
return loggerConfiguration.Sink(
77-
new MSSqlServerSink(
78-
connectionStr,
79-
tableName,
80-
batchPostingLimit,
81-
defaultedPeriod,
82-
formatProvider,
83-
autoCreateSqlTable,
84-
colOpts,
85-
schemaName,
86-
logEventFormatter),
87-
restrictedToMinimumLevel);
77+
IMSSqlServerSinkFactory sinkFactory = new MSSqlServerSinkFactory();
78+
var sink = sinkFactory.Create(connectionStr, tableName, batchPostingLimit, defaultedPeriod,
79+
formatProvider, autoCreateSqlTable, colOpts, schemaName, logEventFormatter);
80+
81+
return loggerConfiguration.Sink(sink, restrictedToMinimumLevel);
8882
}
8983

9084
/// <summary>
@@ -119,20 +113,15 @@ public static LoggerConfiguration MSSqlServer(
119113
if (loggerAuditSinkConfiguration == null)
120114
throw new ArgumentNullException(nameof(loggerAuditSinkConfiguration));
121115

122-
var microsoftExtensionsConfiguration = new ApplyMicrosoftExtensionsConfiguration();
116+
IApplyMicrosoftExtensionsConfiguration microsoftExtensionsConfiguration = new ApplyMicrosoftExtensionsConfiguration();
123117
connectionString = microsoftExtensionsConfiguration.GetConnectionString(connectionString, appConfiguration);
124118
columnOptions = microsoftExtensionsConfiguration.ConfigureColumnOptions(columnOptions, columnOptionsSection);
125119

126-
return loggerAuditSinkConfiguration.Sink(
127-
new MSSqlServerAuditSink(
128-
connectionString,
129-
tableName,
130-
formatProvider,
131-
autoCreateSqlTable,
132-
columnOptions,
133-
schemaName,
134-
logEventFormatter),
135-
restrictedToMinimumLevel);
120+
IMSSqlServerAuditSinkFactory auditSinkFactory = new MSSqlServerAuditSinkFactory();
121+
var auditSink = auditSinkFactory.Create(connectionString, tableName, formatProvider, autoCreateSqlTable,
122+
columnOptions, schemaName, logEventFormatter);
123+
124+
return loggerAuditSinkConfiguration.Sink(auditSink, restrictedToMinimumLevel);
136125
}
137126
}
138127
}

src/Serilog.Sinks.MSSqlServer/Configuration/Extensions/System.Configuration/LoggerConfigurationMSSqlServerExtensions.cs

Lines changed: 43 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using Serilog.Events;
1919
using Serilog.Formatting;
2020
using Serilog.Sinks.MSSqlServer;
21+
using Serilog.Sinks.MSSqlServer.Configuration.Factories;
2122

2223
// System.Configuration support for .NET Framework 4.5.2 libraries and apps.
2324

@@ -66,19 +67,20 @@ public static LoggerConfiguration MSSqlServer(
6667
ITextFormatter logEventFormatter = null) =>
6768
loggerConfiguration.MSSqlServerInternal(
6869
configSectionName: AppConfigSectionName,
69-
connectionString,
70-
tableName,
71-
restrictedToMinimumLevel,
72-
batchPostingLimit,
73-
period,
74-
formatProvider,
75-
autoCreateSqlTable,
76-
columnOptions,
77-
schemaName,
78-
logEventFormatter,
79-
new ApplySystemConfiguration());
80-
81-
// Internal overload with parameters configSectionName and applySystemConfiguration used by tests to override the config section and inject mock
70+
connectionString: connectionString,
71+
tableName: tableName,
72+
restrictedToMinimumLevel: restrictedToMinimumLevel,
73+
batchPostingLimit: batchPostingLimit,
74+
period: period,
75+
formatProvider: formatProvider,
76+
autoCreateSqlTable: autoCreateSqlTable,
77+
columnOptions: columnOptions,
78+
schemaName: schemaName,
79+
logEventFormatter: logEventFormatter,
80+
applySystemConfiguration: new ApplySystemConfiguration(),
81+
sinkFactory: new MSSqlServerSinkFactory());
82+
83+
// Internal overload with parameters used by tests to override the config section and inject mocks
8284
internal static LoggerConfiguration MSSqlServerInternal(
8385
this LoggerSinkConfiguration loggerConfiguration,
8486
string configSectionName,
@@ -92,31 +94,25 @@ internal static LoggerConfiguration MSSqlServerInternal(
9294
ColumnOptions columnOptions = null,
9395
string schemaName = "dbo",
9496
ITextFormatter logEventFormatter = null,
95-
IApplySystemConfiguration applySystemConfiguration = null)
97+
IApplySystemConfiguration applySystemConfiguration = null,
98+
IMSSqlServerSinkFactory sinkFactory = null)
9699
{
97100
if (loggerConfiguration == null)
98101
throw new ArgumentNullException(nameof(loggerConfiguration));
99102

100103
var defaultedPeriod = period ?? MSSqlServerSink.DefaultPeriod;
101104
var colOpts = columnOptions ?? new ColumnOptions();
102105

103-
if (ConfigurationManager.GetSection(configSectionName) is MSSqlServerConfigurationSection serviceConfigSection)
106+
var serviceConfigSection = applySystemConfiguration.GetSinkConfigurationSection(configSectionName);
107+
if (serviceConfigSection != null)
104108
colOpts = applySystemConfiguration.ConfigureColumnOptions(serviceConfigSection, colOpts);
105109

106110
connectionString = applySystemConfiguration.GetConnectionString(connectionString);
107111

108-
return loggerConfiguration.Sink(
109-
new MSSqlServerSink(
110-
connectionString,
111-
tableName,
112-
batchPostingLimit,
113-
defaultedPeriod,
114-
formatProvider,
115-
autoCreateSqlTable,
116-
colOpts,
117-
schemaName,
118-
logEventFormatter),
119-
restrictedToMinimumLevel);
112+
var sink = sinkFactory.Create(connectionString, tableName, batchPostingLimit, defaultedPeriod,
113+
formatProvider, autoCreateSqlTable, colOpts, schemaName, logEventFormatter);
114+
115+
return loggerConfiguration.Sink(sink, restrictedToMinimumLevel);
120116
}
121117

122118
/// <summary>
@@ -148,17 +144,18 @@ public static LoggerConfiguration MSSqlServer(
148144
ITextFormatter logEventFormatter = null) =>
149145
loggerAuditSinkConfiguration.MSSqlServerInternal(
150146
configSectionName: AppConfigSectionName,
151-
connectionString,
152-
tableName,
153-
restrictedToMinimumLevel,
154-
formatProvider,
155-
autoCreateSqlTable,
156-
columnOptions,
157-
schemaName,
158-
logEventFormatter,
159-
new ApplySystemConfiguration());
160-
161-
// Internal overload with parameters configSectionName and applySystemConfiguration used by tests to override the config section and inject mock
147+
connectionString: connectionString,
148+
tableName: tableName,
149+
restrictedToMinimumLevel: restrictedToMinimumLevel,
150+
formatProvider: formatProvider,
151+
autoCreateSqlTable: autoCreateSqlTable,
152+
columnOptions: columnOptions,
153+
schemaName: schemaName,
154+
logEventFormatter: logEventFormatter,
155+
applySystemConfiguration: new ApplySystemConfiguration(),
156+
auditSinkFactory: new MSSqlServerAuditSinkFactory());
157+
158+
// Internal overload with parameters used by tests to override the config section and inject mocks
162159
internal static LoggerConfiguration MSSqlServerInternal(
163160
this LoggerAuditSinkConfiguration loggerAuditSinkConfiguration,
164161
string configSectionName,
@@ -170,28 +167,24 @@ internal static LoggerConfiguration MSSqlServerInternal(
170167
ColumnOptions columnOptions = null,
171168
string schemaName = "dbo",
172169
ITextFormatter logEventFormatter = null,
173-
IApplySystemConfiguration applySystemConfiguration = null)
170+
IApplySystemConfiguration applySystemConfiguration = null,
171+
IMSSqlServerAuditSinkFactory auditSinkFactory = null)
174172
{
175173
if (loggerAuditSinkConfiguration == null)
176174
throw new ArgumentNullException(nameof(loggerAuditSinkConfiguration));
177175

178176
var colOpts = columnOptions ?? new ColumnOptions();
179177

180-
if (ConfigurationManager.GetSection(configSectionName) is MSSqlServerConfigurationSection serviceConfigSection)
178+
var serviceConfigSection = applySystemConfiguration.GetSinkConfigurationSection(configSectionName);
179+
if (serviceConfigSection != null)
181180
colOpts = applySystemConfiguration.ConfigureColumnOptions(serviceConfigSection, colOpts);
182181

183182
connectionString = applySystemConfiguration.GetConnectionString(connectionString);
184183

185-
return loggerAuditSinkConfiguration.Sink(
186-
new MSSqlServerAuditSink(
187-
connectionString,
188-
tableName,
189-
formatProvider,
190-
autoCreateSqlTable,
191-
colOpts,
192-
schemaName,
193-
logEventFormatter),
194-
restrictedToMinimumLevel);
184+
var auditSink = auditSinkFactory.Create(connectionString, tableName, formatProvider, autoCreateSqlTable,
185+
colOpts, schemaName, logEventFormatter);
186+
187+
return loggerAuditSinkConfiguration.Sink(auditSink, restrictedToMinimumLevel);
195188
}
196189
}
197190
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System;
2+
using Serilog.Formatting;
3+
4+
namespace Serilog.Sinks.MSSqlServer.Configuration.Factories
5+
{
6+
internal interface IMSSqlServerAuditSinkFactory
7+
{
8+
MSSqlServerAuditSink Create(
9+
string connectionString,
10+
string tableName,
11+
IFormatProvider formatProvider,
12+
bool autoCreateSqlTable,
13+
ColumnOptions columnOptions,
14+
string schemaName,
15+
ITextFormatter logEventFormatter);
16+
}
17+
}

src/Serilog.Sinks.MSSqlServer/Configuration/Extensions/Hybrid/IMSSqlServerSinkFactory.cs renamed to src/Serilog.Sinks.MSSqlServer/Configuration/Factories/IMSSqlServerSinkFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using System;
22
using Serilog.Formatting;
33

4-
namespace Serilog.Sinks.MSSqlServer.Configuration.Extensions.Hybrid
4+
namespace Serilog.Sinks.MSSqlServer.Configuration.Factories
55
{
66
internal interface IMSSqlServerSinkFactory
77
{
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System;
2+
using Serilog.Formatting;
3+
4+
namespace Serilog.Sinks.MSSqlServer.Configuration.Factories
5+
{
6+
internal class MSSqlServerAuditSinkFactory : IMSSqlServerAuditSinkFactory
7+
{
8+
public MSSqlServerAuditSink Create(
9+
string connectionString,
10+
string tableName,
11+
IFormatProvider formatProvider,
12+
bool autoCreateSqlTable,
13+
ColumnOptions columnOptions,
14+
string schemaName,
15+
ITextFormatter logEventFormatter) =>
16+
new MSSqlServerAuditSink(
17+
connectionString,
18+
tableName,
19+
formatProvider,
20+
autoCreateSqlTable,
21+
columnOptions,
22+
schemaName,
23+
logEventFormatter);
24+
}
25+
}

src/Serilog.Sinks.MSSqlServer/Configuration/Extensions/Hybrid/MSSqlServerSinkFactory.cs renamed to src/Serilog.Sinks.MSSqlServer/Configuration/Factories/MSSqlServerSinkFactory.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using System;
22
using Serilog.Formatting;
33

4-
namespace Serilog.Sinks.MSSqlServer.Configuration.Extensions.Hybrid
4+
namespace Serilog.Sinks.MSSqlServer.Configuration.Factories
55
{
66
internal class MSSqlServerSinkFactory : IMSSqlServerSinkFactory
77
{
@@ -14,9 +14,8 @@ public MSSqlServerSink Create(
1414
bool autoCreateSqlTable,
1515
ColumnOptions columnOptions,
1616
string schemaName,
17-
ITextFormatter logEventFormatter)
18-
{
19-
return new MSSqlServerSink(
17+
ITextFormatter logEventFormatter) =>
18+
new MSSqlServerSink(
2019
connectionString,
2120
tableName,
2221
batchPostingLimit,
@@ -26,6 +25,5 @@ public MSSqlServerSink Create(
2625
columnOptions,
2726
schemaName,
2827
logEventFormatter);
29-
}
3028
}
3129
}

src/Serilog.Sinks.MSSqlServer/Configuration/Implementations/System.Configuration/ApplySystemConfiguration.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Serilog.Configuration;
1+
using System.Configuration;
2+
using Serilog.Configuration;
23
using Serilog.Sinks.MSSqlServer.Configuration;
34

45
namespace Serilog.Sinks.MSSqlServer
@@ -26,6 +27,15 @@ internal ApplySystemConfiguration(
2627
_columnOptionsProvider = columnOptionsProvider;
2728
}
2829

30+
/// <summary>
31+
/// Gets the config section specified and returns it if of type MSSqlServerConfigurationSection or null otherwise.
32+
/// </summary>
33+
/// <param name="configurationSectionName">The name of the config section.</param>
34+
public MSSqlServerConfigurationSection GetSinkConfigurationSection(string configurationSectionName)
35+
{
36+
return ConfigurationManager.GetSection(configurationSectionName) as MSSqlServerConfigurationSection;
37+
}
38+
2939
/// <summary>
3040
/// Examine if supplied connection string is a reference to an item in the "ConnectionStrings" section of web.config
3141
/// If it is, return the ConnectionStrings item, if not, return string as supplied.

0 commit comments

Comments
 (0)