Skip to content

Commit

Permalink
Fixed service clients. (#44)
Browse files Browse the repository at this point in the history
* Fixed the generic parameters of the service client registration methods.

* Removed dependency on obsolete FluentValidation IValidatorFactory.
  • Loading branch information
mgernand authored Sep 20, 2022
1 parent e595d9c commit 7b5654f
Show file tree
Hide file tree
Showing 7 changed files with 29 additions and 74 deletions.
14 changes: 7 additions & 7 deletions src/Fluxera.Extensions.Http/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ public static IServiceCollection AddAccessTokenProvider<TProvider>(this IService
/// <returns></returns>
public static IHttpClientBuilder AddHttpClientService<TService, TImplementation>(this IServiceCollection services,
string remoteServiceName,
Func<HttpClientServiceConfigurationContext, TImplementation> factory)
where TService : class, IHttpClientService
where TImplementation : class, TService
Func<HttpClientServiceConfigurationContext, IServiceProvider, TImplementation> factory)
where TService : class
where TImplementation : class, TService, IHttpClientService
{
Guard.Against.Null(services, nameof(services));
Guard.Against.NullOrWhiteSpace(remoteServiceName, nameof(remoteServiceName));
Expand All @@ -78,7 +78,7 @@ public static IHttpClientBuilder AddHttpClientService<TService, TImplementation>
}

HttpClientServiceConfigurationContext context = new HttpClientServiceConfigurationContext(remoteServiceName, httpClient, options);
return factory.Invoke(context);
return factory.Invoke(context, serviceProvider);
});
}

Expand All @@ -91,9 +91,9 @@ public static IHttpClientBuilder AddHttpClientService<TService, TImplementation>
/// <param name="factory">The factory function that creates a service client instance.</param>
/// <returns></returns>
public static IHttpClientBuilder AddHttpClientService<TService, TImplementation>(this IServiceCollection services,
Func<HttpClientServiceConfigurationContext, TImplementation> factory)
where TService : class, IHttpClientService
where TImplementation : class, TService
Func<HttpClientServiceConfigurationContext, IServiceProvider, TImplementation> factory)
where TService : class
where TImplementation : class, TService, IHttpClientService
{
return services.AddHttpClientService<TService, TImplementation>(RemoteServices.DefaultRemoteServiceName, factory);
}
Expand Down
14 changes: 7 additions & 7 deletions src/Fluxera.Extensions.OData/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ public static class ServiceCollectionExtensions
public static IHttpClientBuilder AddODataClientService<TService, TImplementation>(this IServiceCollection services,
string remoteServiceName,
string collectionName,
Func<ODataClientServiceConfigurationContext, TImplementation> factory)
where TService : class, IODataClientService
where TImplementation : class, TService
Func<ODataClientServiceConfigurationContext, IServiceProvider, TImplementation> factory)
where TService : class
where TImplementation : class, TService, IODataClientService
{
Guard.Against.Null(services, nameof(services));
Guard.Against.NullOrWhiteSpace(remoteServiceName, nameof(remoteServiceName));
Expand Down Expand Up @@ -59,7 +59,7 @@ public static IHttpClientBuilder AddODataClientService<TService, TImplementation
IODataClient oDataClient = oDataClientFactory.CreateClient(remoteServiceName, oDataClientSettings);

ODataClientServiceConfigurationContext context = new ODataClientServiceConfigurationContext(remoteServiceName, collectionName, oDataClient, options);
return factory.Invoke(context);
return factory.Invoke(context, serviceProvider);
});
}

Expand All @@ -74,9 +74,9 @@ public static IHttpClientBuilder AddODataClientService<TService, TImplementation
/// <returns></returns>
public static IHttpClientBuilder AddODataClientService<TService, TImplementation>(this IServiceCollection services,
string collectionName,
Func<ODataClientServiceConfigurationContext, TImplementation> factory)
where TService : class, IODataClientService
where TImplementation : class, TService
Func<ODataClientServiceConfigurationContext, IServiceProvider, TImplementation> factory)
where TService : class
where TImplementation : class, TService, IODataClientService
{
return services.AddODataClientService<TService, TImplementation>(RemoteServices.DefaultRemoteServiceName, collectionName, factory);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,40 +1,42 @@
namespace Fluxera.Extensions.Validation.FluentValidation
{
using System;
using System.Threading.Tasks;
using global::FluentValidation;

/// <summary>
/// A <see cref="IValidator"/> that uses FluentValidation to validate instances.
/// A <see cref="IValidator" /> that uses FluentValidation to validate instances.
/// </summary>
internal sealed class FluentValidationValidator : IValidator
internal sealed class FluentValidationValidator : Fluxera.Extensions.Validation.IValidator
{
private readonly global::FluentValidation.IValidatorFactory validatorFactory;
private readonly IServiceProvider serviceProvider;

public FluentValidationValidator(global::FluentValidation.IValidatorFactory validatorFactory)
public FluentValidationValidator(IServiceProvider serviceProvider)
{
this.validatorFactory = validatorFactory;
this.serviceProvider = serviceProvider;
}

public async Task<ValidationResult> ValidateAsync(object entity)
{
ValidationResult result = new ValidationResult();

global::FluentValidation.IValidator validator = this.validatorFactory.GetValidator(entity.GetType());
Type validatorType = typeof(IValidator<>).MakeGenericType(entity.GetType());

if (validator != null)
if(this.serviceProvider.GetService(validatorType) is IValidator validator)
{
global::FluentValidation.Results.ValidationResult validationResult =
await validator.ValidateAsync(new global::FluentValidation.ValidationContext<object>(entity));

if (!validationResult.IsValid)
if(!validationResult.IsValid)
{
foreach (global::FluentValidation.Results.ValidationFailure validationFailure in validationResult.Errors)
foreach(global::FluentValidation.Results.ValidationFailure validationFailure in validationResult.Errors)
{
result.ValidationErrors.Add(new ValidationError(validationFailure.PropertyName)
{
ErrorMessages =
{
validationFailure.ErrorMessage,
},
}
});
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
namespace Fluxera.Extensions.Validation.FluentValidation{ using System; using JetBrains.Annotations; /// <summary> /// A <see cref="IValidatorFactory"/> that produces <see cref="FluentValidationValidator"/> instances. /// </summary> [UsedImplicitly] internal sealed class FluentValidationValidatorFactory : IValidatorFactory { private readonly IServiceProvider serviceProvider; public FluentValidationValidatorFactory(IServiceProvider serviceProvider) { this.serviceProvider = serviceProvider; } /// <inheritdoc /> public IValidator CreateValidator() { return new FluentValidationValidator(new ServiceProviderValidatorFactory(this.serviceProvider)); } }}
namespace Fluxera.Extensions.Validation.FluentValidation{ using System; using JetBrains.Annotations; /// <summary> /// A <see cref="IValidatorFactory" /> that produces <see cref="FluentValidationValidator" /> instances. /// </summary> [UsedImplicitly] internal sealed class FluentValidationValidatorFactory : IValidatorFactory { private readonly IServiceProvider serviceProvider; public FluentValidationValidatorFactory(IServiceProvider serviceProvider) { this.serviceProvider = serviceProvider; } /// <inheritdoc /> public IValidator CreateValidator() { return new FluentValidationValidator(this.serviceProvider); } }}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public void ShouldCreateNamedHttpClientService()
});

services.AddHttpClientService<ITestHttpClientService, TestHttpClientService>(
context => new TestHttpClientService(context.Name, context.HttpClient, context.Options));
(context, serviceProvider) => new TestHttpClientService(context.Name, context.HttpClient, context.Options));

IServiceProvider serviceProvider = services.BuildServiceProvider();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public void ShouldCreateNamedODataClientService()
});

services.AddODataClientService<ITestODataClientService, TestODataClientService>("People",
context => new TestODataClientService(context.Name, context.CollectionName, context.ODataClient, context.Options));
(context, serviceProvider) => new TestODataClientService(context.Name, context.CollectionName, context.ODataClient, context.Options));

IServiceProvider serviceProvider = services.BuildServiceProvider();

Expand Down

0 comments on commit 7b5654f

Please sign in to comment.