From 2ed3de439ee4aacc51acc6945d59275104953026 Mon Sep 17 00:00:00 2001 From: Macocian Alexandru Victor Date: Sun, 14 May 2023 23:19:32 +0200 Subject: [PATCH] Client web socket resolver (#47) --- .../Http/HttpClientBuilderTests.cs | 1 - .../Http/HttpClientResolverTests.cs | 1 - ...tStandard.DependencyInjection.Tests.csproj | 12 ++-- .../ClientWebSocketResolverTests.cs | 72 +++++++++++++++++++ .../Extensions/ServiceManagerExtensions.cs | 2 - .../Http/HttpClientBuilder.cs | 3 +- .../Http/HttpClientResolver.cs | 3 +- ...ons.NetStandard.DependencyInjection.csproj | 6 +- .../WebSockets/ClientWebSocketResolver.cs | 27 +++++++ ...tensions.NetStandard.Security.Tests.csproj | 10 +-- .../SystemExtensions.NetStandard.Tests.csproj | 10 +-- 11 files changed, 120 insertions(+), 27 deletions(-) create mode 100644 SystemExtensions.DependencyInjection.Tests/WebSockets/ClientWebSocketResolverTests.cs create mode 100644 SystemExtensions.NetStandard.DependencyInjection/WebSockets/ClientWebSocketResolver.cs diff --git a/SystemExtensions.DependencyInjection.Tests/Http/HttpClientBuilderTests.cs b/SystemExtensions.DependencyInjection.Tests/Http/HttpClientBuilderTests.cs index 91fca56..d958fa1 100644 --- a/SystemExtensions.DependencyInjection.Tests/Http/HttpClientBuilderTests.cs +++ b/SystemExtensions.DependencyInjection.Tests/Http/HttpClientBuilderTests.cs @@ -3,7 +3,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using Slim; using System; -using System.DependencyInjection.Http; using System.Linq; using System.Net.Http; using System.Threading.Tasks; diff --git a/SystemExtensions.DependencyInjection.Tests/Http/HttpClientResolverTests.cs b/SystemExtensions.DependencyInjection.Tests/Http/HttpClientResolverTests.cs index a7ebb7d..8adb277 100644 --- a/SystemExtensions.DependencyInjection.Tests/Http/HttpClientResolverTests.cs +++ b/SystemExtensions.DependencyInjection.Tests/Http/HttpClientResolverTests.cs @@ -2,7 +2,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System; -using System.Http; using System.Net.Http; namespace SystemExtensions.DependencyInjection.Tests.Http; diff --git a/SystemExtensions.DependencyInjection.Tests/SystemExtensions.NetStandard.DependencyInjection.Tests.csproj b/SystemExtensions.DependencyInjection.Tests/SystemExtensions.NetStandard.DependencyInjection.Tests.csproj index 4d26f95..4178439 100644 --- a/SystemExtensions.DependencyInjection.Tests/SystemExtensions.NetStandard.DependencyInjection.Tests.csproj +++ b/SystemExtensions.DependencyInjection.Tests/SystemExtensions.NetStandard.DependencyInjection.Tests.csproj @@ -7,12 +7,12 @@ - - - - - - + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/SystemExtensions.DependencyInjection.Tests/WebSockets/ClientWebSocketResolverTests.cs b/SystemExtensions.DependencyInjection.Tests/WebSockets/ClientWebSocketResolverTests.cs new file mode 100644 index 0000000..0033e24 --- /dev/null +++ b/SystemExtensions.DependencyInjection.Tests/WebSockets/ClientWebSocketResolverTests.cs @@ -0,0 +1,72 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using System; +using System.Net.WebSockets; +using FluentAssertions; +using Microsoft.Extensions.Logging; + +namespace SystemExtensions.NetStandard.DependencyInjection.Tests.WebSockets; + +[TestClass] +public sealed class ClientWebSocketResolverTests +{ + private readonly ClientWebSocketResolver webSocketResolver = new(); + private readonly Mock serviceProviderMock = new(); + + [TestMethod] + public void CanResolve_IHttpClient_ReturnsTrue() + { + var type = typeof(IClientWebSocket<>); + + var canResolve = this.webSocketResolver.CanResolve(type); + + canResolve.Should().BeTrue(); + } + + [TestMethod] + public void CanResolve_AnythingElse_ReturnsFalse() + { + var types = new Type[] { typeof(ClientWebSocket), typeof(object), typeof(string), typeof(ClientWebSocketResolverTests), typeof(int) }; + + foreach (var type in types) + { + var canResolve = this.webSocketResolver.CanResolve(type); + + canResolve.Should().BeFalse(); + } + } + + [TestMethod] + public void Resolve_TypedClient_ReturnsIClientWebSocketResolver() + { + var loggerMock = new Mock>(); + this.serviceProviderMock.Setup(u => u.GetService(typeof(ILogger))) + .Returns(loggerMock.Object); + + var client = this.webSocketResolver.Resolve(this.serviceProviderMock.Object, typeof(IClientWebSocket)); + + client.Should().BeAssignableTo>(); + } + + [TestMethod] + public void Resolve_NonGenericType_Throws() + { + Action action = new(() => + { + this.webSocketResolver.Resolve(this.serviceProviderMock.Object, typeof(IClientWebSocket<>)); + }); + + action.Should().Throw(); + } + + [TestMethod] + public void Resolve_RandomType_Throws() + { + Action action = new(() => + { + this.webSocketResolver.Resolve(this.serviceProviderMock.Object, typeof(string)); + }); + + action.Should().Throw(); + } +} diff --git a/SystemExtensions.NetStandard.DependencyInjection/Extensions/ServiceManagerExtensions.cs b/SystemExtensions.NetStandard.DependencyInjection/Extensions/ServiceManagerExtensions.cs index e6409a7..a50189f 100644 --- a/SystemExtensions.NetStandard.DependencyInjection/Extensions/ServiceManagerExtensions.cs +++ b/SystemExtensions.NetStandard.DependencyInjection/Extensions/ServiceManagerExtensions.cs @@ -2,8 +2,6 @@ using Microsoft.Extensions.Options; using Slim; using System.Configuration; -using System.DependencyInjection.Http; -using System.Http; using System.Logging; using System.Net.Http; diff --git a/SystemExtensions.NetStandard.DependencyInjection/Http/HttpClientBuilder.cs b/SystemExtensions.NetStandard.DependencyInjection/Http/HttpClientBuilder.cs index 77ae707..072f9d8 100644 --- a/SystemExtensions.NetStandard.DependencyInjection/Http/HttpClientBuilder.cs +++ b/SystemExtensions.NetStandard.DependencyInjection/Http/HttpClientBuilder.cs @@ -1,9 +1,8 @@ using Slim; using System.Extensions; -using System.Net.Http; using System.Net.Http.Headers; -namespace System.DependencyInjection.Http; +namespace System.Net.Http; public sealed class HttpClientBuilder { diff --git a/SystemExtensions.NetStandard.DependencyInjection/Http/HttpClientResolver.cs b/SystemExtensions.NetStandard.DependencyInjection/Http/HttpClientResolver.cs index ff607e5..0f9cf6d 100644 --- a/SystemExtensions.NetStandard.DependencyInjection/Http/HttpClientResolver.cs +++ b/SystemExtensions.NetStandard.DependencyInjection/Http/HttpClientResolver.cs @@ -1,8 +1,7 @@ using Slim.Resolvers; using System.Linq; -using System.Net.Http; -namespace System.Http; +namespace System.Net.Http; [Obsolete($"Please use {nameof(Extensions.ServiceManagerExtensions.RegisterHttpClient)} for each use case of {nameof(IHttpClient)}")] public sealed class HttpClientResolver : IDependencyResolver diff --git a/SystemExtensions.NetStandard.DependencyInjection/SystemExtensions.NetStandard.DependencyInjection.csproj b/SystemExtensions.NetStandard.DependencyInjection/SystemExtensions.NetStandard.DependencyInjection.csproj index e3b5bdc..c181743 100644 --- a/SystemExtensions.NetStandard.DependencyInjection/SystemExtensions.NetStandard.DependencyInjection.csproj +++ b/SystemExtensions.NetStandard.DependencyInjection/SystemExtensions.NetStandard.DependencyInjection.csproj @@ -6,7 +6,7 @@ LICENSE true latest - 1.2.3 + 1.3 Alexandru Macocian https://github.com/AlexMacocian/SystemExtensions Extensions for the Slim Dependency Injection engine @@ -21,9 +21,9 @@ - + - + diff --git a/SystemExtensions.NetStandard.DependencyInjection/WebSockets/ClientWebSocketResolver.cs b/SystemExtensions.NetStandard.DependencyInjection/WebSockets/ClientWebSocketResolver.cs new file mode 100644 index 0000000..c39141c --- /dev/null +++ b/SystemExtensions.NetStandard.DependencyInjection/WebSockets/ClientWebSocketResolver.cs @@ -0,0 +1,27 @@ +using Microsoft.Extensions.Logging; + +namespace System.Net.WebSockets; +public sealed class ClientWebSocketResolver +{ + private static readonly Type ClientType = typeof(ClientWebSocket<>); + private static readonly Type LoggerType = typeof(ILogger<>); + + public bool CanResolve(Type type) + { + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IClientWebSocket<>)) + { + return true; + } + + return false; + } + + public object Resolve(Slim.IServiceProvider serviceProvider, Type type) + { + var typedClientType = ClientType.MakeGenericType(type.GetGenericArguments()); + var typedLoggerType = LoggerType.MakeGenericType(type.GetGenericArguments()); + var logger = serviceProvider.GetService(typedLoggerType); + var client = Activator.CreateInstance(typedClientType, new object[] { logger }); + return client; + } +} diff --git a/SystemExtensions.NetStandard.Security.Tests/SystemExtensions.NetStandard.Security.Tests.csproj b/SystemExtensions.NetStandard.Security.Tests/SystemExtensions.NetStandard.Security.Tests.csproj index 170624b..2fe4e18 100644 --- a/SystemExtensions.NetStandard.Security.Tests/SystemExtensions.NetStandard.Security.Tests.csproj +++ b/SystemExtensions.NetStandard.Security.Tests/SystemExtensions.NetStandard.Security.Tests.csproj @@ -7,11 +7,11 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/SystemExtensions.Tests/SystemExtensions.NetStandard.Tests.csproj b/SystemExtensions.Tests/SystemExtensions.NetStandard.Tests.csproj index 9fd7a6c..f12adaf 100644 --- a/SystemExtensions.Tests/SystemExtensions.NetStandard.Tests.csproj +++ b/SystemExtensions.Tests/SystemExtensions.NetStandard.Tests.csproj @@ -7,11 +7,11 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive