Skip to content

Commit 3a1e99a

Browse files
authored
Merge pull request #65 from yurii-bart/feat/add-injectable-logger
Feat/add injectable logger
2 parents 332118c + 2f2a396 commit 3a1e99a

File tree

5 files changed

+39
-50
lines changed

5 files changed

+39
-50
lines changed

route4me-csharp-sdk/Route4MeSDKLibrary/HttpClientHolder.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,29 @@
11
using System;
22
using System.Net.Http;
33

4+
using Microsoft.Extensions.Logging;
5+
46
namespace Route4MeSDKLibrary
57
{
68
internal class HttpClientHolder : IDisposable
79
{
810
private readonly string _baseAddress;
911

10-
public HttpClientHolder(HttpClient httpClient, string baseAddress)
12+
public HttpClientHolder(HttpClient httpClient, string baseAddress, ILogger logger = null)
1113
{
1214
HttpClient = httpClient;
1315
_baseAddress = baseAddress;
16+
Logger = logger;
1417
}
1518

1619
public HttpClient HttpClient { get; }
1720

21+
/// <summary>
22+
/// Logger instance for this HTTP client holder.
23+
/// Thread-safe as each holder instance has its own logger reference.
24+
/// </summary>
25+
public ILogger Logger { get; }
26+
1827
public void Dispose()
1928
{
2029
HttpClientHolderManager.ReleaseHttpClientHolder(_baseAddress);

route4me-csharp-sdk/Route4MeSDKLibrary/HttpClientHolderManager.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,13 @@ internal class HttpClientHolderManager
2626
/// </summary>
2727
public static TimeSpan RequestsTimeout { get; set; } = TimeSpan.FromSeconds(30);
2828

29-
/// <summary>
30-
/// Static logger for HTTP client connection pooling operations.
31-
/// Thread-safe via SyncRoot lock in all access points.
32-
/// </summary>
33-
public static ILogger Logger { get; set; }
34-
3529
static HttpClientHolderManager()
3630
{
3731
// ReSharper disable once ObjectCreationAsStatement
3832
new SequentialTimer(OnTimerCallback, TimeSpan.FromHours(2));
3933
}
4034

41-
public static HttpClientHolder AcquireHttpClientHolder(string baseAddress, string apiKey = null)
35+
public static HttpClientHolder AcquireHttpClientHolder(string baseAddress, string apiKey = null, ILogger logger = null)
4236
{
4337
lock (SyncRoot)
4438
{
@@ -55,7 +49,7 @@ public static HttpClientHolder AcquireHttpClientHolder(string baseAddress, strin
5549
HttpClientWrappers.Add(baseAddress, wrapper);
5650
}
5751

58-
return new HttpClientHolder(wrapper.HttpClient, baseAddress);
52+
return new HttpClientHolder(wrapper.HttpClient, baseAddress, logger);
5953
}
6054
}
6155

route4me-csharp-sdk/Route4MeSDKLibrary/Managers/Route4MeManagerBase.cs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -161,13 +161,8 @@ protected async Task<Tuple<T, ResultResponse, string>> GetJsonObjectFromAPIAsync
161161
try
162162
{
163163
using (var httpClientHolder =
164-
HttpClientHolderManager.AcquireHttpClientHolder(uri.GetLeftPart(UriPartial.Authority), v5 ? ApiKey : null))
164+
HttpClientHolderManager.AcquireHttpClientHolder(uri.GetLeftPart(UriPartial.Authority), v5 ? ApiKey : null, Logger))
165165
{
166-
if (Logger != null)
167-
{
168-
HttpClientHolderManager.Logger = Logger;
169-
}
170-
171166
switch (httpMethod)
172167
{
173168
case HttpMethodType.Get:
@@ -408,13 +403,8 @@ protected T GetJsonObjectFromAPI<T>(GenericParameters optimizationParameters,
408403
try
409404
{
410405
using (var httpClientHolder =
411-
HttpClientHolderManager.AcquireHttpClientHolder(uri.GetLeftPart(UriPartial.Authority), v5 ? ApiKey : null))
406+
HttpClientHolderManager.AcquireHttpClientHolder(uri.GetLeftPart(UriPartial.Authority), v5 ? ApiKey : null, Logger))
412407
{
413-
if (Logger != null)
414-
{
415-
HttpClientHolderManager.Logger = Logger;
416-
}
417-
418408
switch (httpMethod)
419409
{
420410
case HttpMethodType.Get:

route4me-csharp-sdk/Route4MeSDKLibrary/Route4MeManagerV5.cs

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
using System;
22
using System.Threading.Tasks;
33

4-
using Microsoft.Extensions.Logging;
5-
64
using Route4MeSDK.DataTypes.V5;
75
using Route4MeSDK.DataTypes.V5.TelematicsPlatform;
86
using Route4MeSDK.QueryTypes.V5;
@@ -56,26 +54,6 @@ public Route4MeManagerV5(string apiKey)
5654
_locationManager = new LocationManagerV5(apiKey);
5755
_customerManager = new CustomerManagerV5(apiKey);
5856
_facilityManager = new FacilityManagerV5(apiKey);
59-
_logger = null;
60-
}
61-
62-
public Route4MeManagerV5(string apiKey, ILogger logger)
63-
{
64-
_logger = logger;
65-
_addressBookContactsManager = new AddressBookContactsManagerV5(apiKey, logger);
66-
_accountProfileManager = new AccountProfileManagerV5(apiKey, logger);
67-
_addressBarcodeManager = new AddressBarcodeManagerV5(apiKey, logger);
68-
_teamManagementManager = new TeamManagementManagerV5(apiKey, logger);
69-
_driveReviewManager = new DriveReviewManagerV5(apiKey, logger);
70-
_routeManager = new RouteManagerV5(apiKey, logger);
71-
_optimizationManager = new OptimizationManagerV5(apiKey, logger);
72-
_vehicleManager = new VehicleManagerV5(apiKey, logger);
73-
_telematicsManager = new TelematicsManagerV5(apiKey, logger);
74-
_orderManager = new OrderManagerV5(apiKey, logger);
75-
_routeStatusManager = new RouteStatusManagerV5(apiKey, logger);
76-
_locationManager = new LocationManagerV5(apiKey, logger);
77-
_customerManager = new CustomerManagerV5(apiKey, logger);
78-
_facilityManager = new FacilityManagerV5(apiKey, logger);
7957
}
8058

8159
#endregion
@@ -96,7 +74,6 @@ public Route4MeManagerV5(string apiKey, ILogger logger)
9674
private readonly LocationManagerV5 _locationManager;
9775
private readonly CustomerManagerV5 _customerManager;
9876
private readonly FacilityManagerV5 _facilityManager;
99-
private readonly ILogger _logger;
10077

10178
#endregion
10279

route4me-csharp-sdk/Route4MeSDKTest/Examples/API5/LoggingExample.cs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,18 @@
55
using Route4MeSDK.DataTypes.V5;
66
using Route4MeSDK.QueryTypes.V5;
77

8+
using Route4MeSDKLibrary.Managers;
9+
810
namespace Route4MeSDK.Examples
911
{
1012
public sealed partial class Route4MeExamples
1113
{
1214
/// <summary>
1315
/// Example demonstrating how to use Microsoft.Extensions.Logging with Route4Me SDK.
1416
/// This shows how to inject a logger to capture HTTP requests, responses, and errors.
17+
///
18+
/// Note: Logger injection is supported by specialized V5 managers (RouteManagerV5, VehicleManagerV5, etc.)
19+
/// that inherit from Route4MeManagerBase. The facade Route4MeManagerV5 does not support logger injection.
1520
/// </summary>
1621
public void LoggingExample()
1722
{
@@ -26,12 +31,14 @@ public void LoggingExample()
2631
});
2732

2833
// Step 2: Create a logger for Route4Me operations
29-
var logger = loggerFactory.CreateLogger<Route4MeManagerV5>();
34+
var logger = loggerFactory.CreateLogger<RouteManagerV5>();
3035

31-
Console.WriteLine("Creating Route4MeManagerV5 with logger...\n");
36+
Console.WriteLine("Creating RouteManagerV5 with logger...\n");
3237

33-
// Step 3: Create Route4MeManagerV5 with logger injection
34-
var route4Me = new Route4MeManagerV5(ActualApiKey, logger);
38+
// Step 3: Create a specialized manager with logger injection
39+
// The logger is passed to the constructor and will be used for all API calls
40+
// This is thread-safe - each manager instance has its own logger reference
41+
var routeManager = new RouteManagerV5(ActualApiKey, logger);
3542

3643
Console.WriteLine("Making API call - watch for log output below:\n");
3744
Console.WriteLine("----------------------------------------");
@@ -45,17 +52,24 @@ public void LoggingExample()
4552

4653
try
4754
{
48-
var result = route4Me.GetRoutes(routeParameters, out ResultResponse resultResponse);
55+
var result = routeManager.GetRoutes(routeParameters, out ResultResponse resultResponse);
4956

5057
Console.WriteLine("----------------------------------------\n");
5158

5259
if (resultResponse.Status)
5360
{
54-
Console.WriteLine($"Success! Retrieved {result.Length} routes");
61+
Console.WriteLine($"Success! Retrieved {result?.Length ?? 0} routes");
5562
}
5663
else
5764
{
5865
Console.WriteLine("Request failed - check logs for details");
66+
if (resultResponse.Messages != null)
67+
{
68+
foreach (var msg in resultResponse.Messages)
69+
{
70+
Console.WriteLine($" {msg.Key}: {string.Join(", ", msg.Value)}");
71+
}
72+
}
5973
}
6074
}
6175
catch (Exception ex)
@@ -64,6 +78,11 @@ public void LoggingExample()
6478
}
6579

6680
Console.WriteLine("\n=== Logging Example Complete ===");
81+
Console.WriteLine("\nTip: You can use different specialized managers with their own loggers:");
82+
Console.WriteLine(" - VehicleManagerV5(apiKey, vehicleLogger)");
83+
Console.WriteLine(" - OrderManagerV5(apiKey, orderLogger)");
84+
Console.WriteLine(" - AddressBookContactsManagerV5(apiKey, contactLogger)");
85+
Console.WriteLine(" Each manager instance is thread-safe with its own logger context.");
6786
}
6887
}
6988
}

0 commit comments

Comments
 (0)