diff --git a/WpfExtended.Test/Http/HttpMessageLogger.cs b/WpfExtended.Test/Http/HttpMessageLogger.cs new file mode 100644 index 0000000..7998a40 --- /dev/null +++ b/WpfExtended.Test/Http/HttpMessageLogger.cs @@ -0,0 +1,25 @@ +using Microsoft.Extensions.Logging; +using System.Extensions; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +namespace WpfExtended.Tests.Http +{ + public class HttpMessageLogger : DelegatingHandler + { + private readonly ILogger logger; + public HttpMessageLogger(ILogger logger, HttpMessageHandler innerHandler) : base(innerHandler) + { + this.logger = logger.ThrowIfNull(nameof(logger)); + } + + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + this.logger.LogInformation($"{request.Method} - {request.RequestUri}"); + var response = await base.SendAsync(request, cancellationToken); + this.logger.LogInformation($"{response.RequestMessage.RequestUri} - {response.StatusCode}"); + return response; + } + } +} diff --git a/WpfExtended.Test/Launcher.cs b/WpfExtended.Test/Launcher.cs index f1a25cf..ecf57e1 100644 --- a/WpfExtended.Test/Launcher.cs +++ b/WpfExtended.Test/Launcher.cs @@ -1,7 +1,13 @@ -using Slim; +using Microsoft.Extensions.Logging; +using Slim; using System; +using System.Extensions; +using System.Http; +using System.Net.Http; using System.Windows.Extensions; +using System.Windows.Extensions.Http; using WpfExtended.Test; +using WpfExtended.Tests.Http; namespace WpfExtended.Tests { @@ -15,6 +21,18 @@ namespace WpfExtended.Tests return Instance.Run(); } + protected override void SetupServiceManager(IServiceManager serviceManager) + { + serviceManager.RegisterResolver( + new HttpClientResolver() + .WithHttpMessageHandlerFactory((sp, category) => + { + var loggerType = typeof(ILogger<>).MakeGenericType(category); + var logger = sp.GetService(loggerType).As(); + return new HttpMessageLogger(logger, new HttpClientHandler()); + })); + } + protected override void ApplicationClosing() { } diff --git a/WpfExtended/Extensions/ServiceManagerExtensions.cs b/WpfExtended/Extensions/ServiceManagerExtensions.cs index 7e7c65c..cefbdec 100644 --- a/WpfExtended/Extensions/ServiceManagerExtensions.cs +++ b/WpfExtended/Extensions/ServiceManagerExtensions.cs @@ -1,5 +1,6 @@ using Slim; using System.Extensions; +using System.Net.Http; using System.Windows.Extensions.Http; namespace System.Windows.Extensions @@ -10,9 +11,17 @@ namespace System.Windows.Extensions { serviceManager.ThrowIfNull(nameof(serviceManager)); + serviceManager.RegisterResolver(new HttpClientResolver()); + return serviceManager; + } + + public static IServiceProducer RegisterHttpFactory(this IServiceManager serviceManager, Func handlerFactory) + { + serviceManager.ThrowIfNull(nameof(serviceManager)); + serviceManager.RegisterResolver( new HttpClientResolver() - .WithLogEvents(true)); + .WithHttpMessageHandlerFactory(handlerFactory)); return serviceManager; } } diff --git a/WpfExtended/Http/HttpClientResolver.cs b/WpfExtended/Http/HttpClientResolver.cs index f4aa4c4..50898d0 100644 --- a/WpfExtended/Http/HttpClientResolver.cs +++ b/WpfExtended/Http/HttpClientResolver.cs @@ -3,6 +3,7 @@ using Slim.Resolvers; using System.Extensions; using System.Http; using System.Linq; +using System.Net.Http; namespace System.Windows.Extensions.Http { @@ -11,11 +12,19 @@ namespace System.Windows.Extensions.Http private static readonly Type clientType = typeof(HttpClient<>); private static readonly Type loggerType = typeof(ILogger<>); - public bool LogEvents { get; set; } + /// + /// Factory method. parameter of the factory is the scope of . + /// + public Func HttpMessageHandlerFactory { get; set; } - public HttpClientResolver WithLogEvents(bool logEvents) + /// + /// Sets the . + /// + /// Factory method. parameter of the factory is the scope of . + /// + public HttpClientResolver WithHttpMessageHandlerFactory(Func factory) { - this.LogEvents = logEvents; + this.HttpMessageHandlerFactory = factory; return this; } @@ -32,23 +41,13 @@ namespace System.Windows.Extensions.Http public object Resolve(Slim.IServiceProvider serviceProvider, Type type) { var typedClientType = clientType.MakeGenericType(type.GetGenericArguments()); - var httpClient = Activator.CreateInstance(typedClientType); - if (this.LogEvents is false) - { - return httpClient; - } - var typedLoggerType = loggerType.MakeGenericType(type.GetGenericArguments()); var logger = serviceProvider.GetService(typedLoggerType).As(); - var eventInfo = httpClient.GetType().GetEvents().Where(ev => ev.Name == nameof(HttpClient.EventEmitted)).First(); - var handler = new EventHandler((sender, message) => LogHttpMessage(sender, message, logger)); - eventInfo.AddMethod.Invoke(httpClient, new object[] { handler }); + var handler = this.HttpMessageHandlerFactory?.Invoke(serviceProvider, type.GetGenericArguments().First()); + var httpClient = handler is null ? + Activator.CreateInstance(typedClientType) : + Activator.CreateInstance(typedClientType, new object[] { handler }); return httpClient; } - - private static void LogHttpMessage(object sender, HttpClientEventMessage httpClientEventMessage, ILogger logger) - { - logger.LogInformation($"{httpClientEventMessage.Method} - {httpClientEventMessage.Url}"); - } } } diff --git a/WpfExtended/WpfExtended.csproj b/WpfExtended/WpfExtended.csproj index c830b8d..d449100 100644 --- a/WpfExtended/WpfExtended.csproj +++ b/WpfExtended/WpfExtended.csproj @@ -6,7 +6,7 @@ true true License.txt - 0.3.1 + 0.3.2 latest Extension library for Windows Presentation Platform.