Enhance ReC.Client library with new features and cleanup
- Added comprehensive XML documentation for `DependencyInjection` and `ReCClient` classes to improve code readability. - Introduced overload for `AddRecClient` to allow flexible `HttpClient` configuration. - Added static `BuildStaticClient` and `Create` methods for simplified client instantiation. - Marked synchronous `InvokeRecAction` method as obsolete to encourage asynchronous usage. - Updated `ReC.Client.csproj`: - Added `<DocumentationFile>` property for XML doc generation. - Downgraded `Microsoft.Extensions.Http` to version 8.0.0. - Removed `System.Text.Json` package reference. - Removed `System.Text.Json` dependency from `ReCClient.cs`. - Generated unique `HttpClient` name for `ReCClient` instances. - Performed general code cleanup and improved method remarks.
This commit is contained in:
parent
91c8b98f44
commit
5f9e716ca6
@ -6,8 +6,17 @@ using System.Net.Http;
|
||||
|
||||
namespace ReC.Client
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides extension methods for setting up the ReC client in an <see cref="IServiceCollection"/>.
|
||||
/// </summary>
|
||||
public static class DependencyInjection
|
||||
{
|
||||
/// <summary>
|
||||
/// Adds and configures the <see cref="HttpClient"/> for the <see cref="ReCClient"/> to the specified <see cref="IServiceCollection"/>
|
||||
/// </summary>
|
||||
/// <param name="services">The <see cref="IServiceCollection"/> to add the services to.</param>
|
||||
/// <param name="apiUri">The base URI of the ReC API.</param>
|
||||
/// <returns>An <see cref="IHttpClientBuilder"/> that can be used to configure the client.</returns>
|
||||
public static IHttpClientBuilder AddRecClient(this IServiceCollection services, string apiUri)
|
||||
{
|
||||
return services.AddHttpClient(ReCClient.ClientName, client =>
|
||||
@ -16,6 +25,12 @@ namespace ReC.Client
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds and configures the <see cref="HttpClient"/> for the <see cref="ReCClient"/> to the specified <see cref="IServiceCollection"/>
|
||||
/// </summary>
|
||||
/// <param name="services">The <see cref="IServiceCollection"/> to add the services to.</param>
|
||||
/// <param name="configureClient">An action to configure the <see cref="HttpClient"/>.</param>
|
||||
/// <returns>An <see cref="IHttpClientBuilder"/> that can be used to configure the client.</returns>
|
||||
public static IHttpClientBuilder AddRecClient(this IServiceCollection services, Action<HttpClient> configureClient)
|
||||
{
|
||||
return services.AddHttpClient(ReCClient.ClientName, configureClient);
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net462;net8.0</TargetFrameworks>
|
||||
<DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(MSBuildProjectName).xml</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(TargetFramework)' != 'net462'">
|
||||
@ -10,8 +11,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Version="10.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Version="8.0.0" />
|
||||
<PackageReference Include="System.Net.Http" Version="4.3.4" />
|
||||
<PackageReference Include="System.Text.Json" Version="9.0.11" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
using System.Text.Json;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
#if NETFRAMEWORK
|
||||
using System;
|
||||
@ -10,23 +9,36 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace ReC.Client
|
||||
{
|
||||
/// <summary>
|
||||
/// A client for interacting with the ReC API.
|
||||
/// </summary>
|
||||
public class ReCClient
|
||||
{
|
||||
private readonly HttpClient _http;
|
||||
|
||||
/// <summary>
|
||||
/// A unique name for the HttpClient used by the ReCClient.
|
||||
/// </summary>
|
||||
public static readonly string ClientName = Guid.NewGuid().ToString();
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="ReCClient"/> class.
|
||||
/// </summary>
|
||||
/// <param name="httpClientFactory">The factory to create HttpClients.</param>
|
||||
public ReCClient(IHttpClientFactory httpClientFactory)
|
||||
{
|
||||
_http = httpClientFactory.CreateClient(ClientName);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// POST api/RecAction/invoke/{profileId}
|
||||
/// Asynchronously invokes a ReC action for a specific profile.
|
||||
/// </summary>
|
||||
/// <param name="profileId"></param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <returns>True if the request was successful, false otherwise</returns>
|
||||
/// <remarks>
|
||||
/// This method sends a POST request to the <c>api/RecAction/invoke/{profileId}</c> endpoint.
|
||||
/// </remarks>
|
||||
/// <param name="profileId">The ID of the profile to invoke the action for.</param>
|
||||
/// <param name="cancellationToken">A token to cancel the asynchronous operation.</param>
|
||||
/// <returns>A <see cref="Task{TResult}"/> that represents the asynchronous operation. The task result is <see langword="true"/> if the request was successful; otherwise, <see langword="false"/>.</returns>
|
||||
public async Task<bool> InvokeRecActionAsync(int profileId, CancellationToken cancellationToken = default)
|
||||
{
|
||||
var resp = await _http.PostAsync($"api/RecAction/invoke/{profileId}", content: null, cancellationToken);
|
||||
@ -34,10 +46,14 @@ namespace ReC.Client
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// POST api/RecAction/invoke/{profileId} (Synchronous version)
|
||||
/// Synchronously invokes a ReC action for a specific profile.
|
||||
/// </summary>
|
||||
/// <param name="profileId"></param>
|
||||
/// <returns>True if the request was successful, false otherwise</returns>
|
||||
/// <remarks>
|
||||
/// This method sends a POST request to the <c>api/RecAction/invoke/{profileId}</c> endpoint.
|
||||
/// This is the synchronous version of <see cref="InvokeRecActionAsync(int, CancellationToken)"/>.
|
||||
/// </remarks>
|
||||
/// <param name="profileId">The ID of the profile to invoke the action for.</param>
|
||||
/// <returns><see langword="true"/> if the request was successful; otherwise, <see langword="false"/>.</returns>
|
||||
[Obsolete("Use InvokeRecActionAsync instead to avoid potential deadlocks and improve performance.")]
|
||||
public bool InvokeRecAction(int profileId)
|
||||
{
|
||||
@ -54,6 +70,14 @@ namespace ReC.Client
|
||||
private static IServiceProvider Provider = null;
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Configures and builds the static <see cref="IServiceProvider"/> for creating <see cref="ReCClient"/> instances.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This method should only be called once during application startup.
|
||||
/// </remarks>
|
||||
/// <param name="apiUri">The base URI of the ReC API.</param>
|
||||
/// <exception cref="InvalidOperationException">Thrown if the static provider has already been built.</exception>
|
||||
public static void BuildStaticClient(string apiUri)
|
||||
{
|
||||
if(Provider != null)
|
||||
@ -66,6 +90,11 @@ namespace ReC.Client
|
||||
Provider = Services.BuildServiceProvider();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new <see cref="ReCClient"/> instance using the statically configured provider.
|
||||
/// </summary>
|
||||
/// <returns>A new instance of the <see cref="ReCClient"/>.</returns>
|
||||
/// <exception cref="InvalidOperationException">Thrown if <see cref="BuildStaticClient(string)"/> has not been called yet.</exception>
|
||||
public static ReCClient Create()
|
||||
{
|
||||
if (Provider == null)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user