From 6ea6afb5f2707a9f868df2508ced4a251b42077d Mon Sep 17 00:00:00 2001 From: Cyprien Autexier Date: Mon, 26 Sep 2016 21:56:52 +0200 Subject: [PATCH 1/2] Add Request Filters support --- src/GeekLearning.RestKit.Core/ClientBase.cs | 16 ++++++++++-- .../ClientOptionsBase.cs | 25 +++++++++++++++++++ .../IProvideRequestFilters.cs | 12 +++++++++ .../IRequestFilter.cs | 13 ++++++++++ 4 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 src/GeekLearning.RestKit.Core/ClientOptionsBase.cs create mode 100644 src/GeekLearning.RestKit.Core/IProvideRequestFilters.cs create mode 100644 src/GeekLearning.RestKit.Core/IRequestFilter.cs diff --git a/src/GeekLearning.RestKit.Core/ClientBase.cs b/src/GeekLearning.RestKit.Core/ClientBase.cs index 90a435c..e64be0a 100644 --- a/src/GeekLearning.RestKit.Core/ClientBase.cs +++ b/src/GeekLearning.RestKit.Core/ClientBase.cs @@ -8,11 +8,12 @@ namespace GeekLearning.RestKit.Core { public abstract class ClientBase - where TOptions : class, new() + where TOptions : class, IProvideRequestFilters, new() { private IMediaFormatterProvider mediaFormatterProvider; - public ClientBase(IOptions options, IMediaFormatterProvider mediaFormatterProvider) + public ClientBase(IOptions options, + IMediaFormatterProvider mediaFormatterProvider) { this.Options = options.Value; this.mediaFormatterProvider = mediaFormatterProvider; @@ -30,6 +31,17 @@ protected Task TransformResponseAsync(HttpResponseMessage mess return mediaFormatter.TransformAsync(message.Content); } + protected HttpRequestMessage ApplyFilters(HttpRequestMessage requestMessage, params string[] securityDefinitions) + { + HttpRequestMessage finalMessage = requestMessage; + foreach (var filter in this.Options.RequestFilters) + { + finalMessage = filter.Apply(requestMessage, securityDefinitions) ?? finalMessage; + } + + return finalMessage; + } + protected HttpContent TransformRequestBody(object data, string mediaType) { IMediaFormatter mediaFormatter = this.mediaFormatterProvider.GetMediaFormatter(mediaType); diff --git a/src/GeekLearning.RestKit.Core/ClientOptionsBase.cs b/src/GeekLearning.RestKit.Core/ClientOptionsBase.cs new file mode 100644 index 0000000..2fb98ea --- /dev/null +++ b/src/GeekLearning.RestKit.Core/ClientOptionsBase.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace GeekLearning.RestKit.Core +{ + public abstract class ClientOptionsBase : IProvideRequestFilters + { + private List requestfilters = new List(); + + public void AddFilter(IRequestFilter filter) + { + this.requestfilters.Add(filter); + } + + public IEnumerable RequestFilters + { + get + { + return requestfilters; + } + } + } +} diff --git a/src/GeekLearning.RestKit.Core/IProvideRequestFilters.cs b/src/GeekLearning.RestKit.Core/IProvideRequestFilters.cs new file mode 100644 index 0000000..5a890a6 --- /dev/null +++ b/src/GeekLearning.RestKit.Core/IProvideRequestFilters.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace GeekLearning.RestKit.Core +{ + public interface IProvideRequestFilters + { + IEnumerable RequestFilters { get; } + } +} diff --git a/src/GeekLearning.RestKit.Core/IRequestFilter.cs b/src/GeekLearning.RestKit.Core/IRequestFilter.cs new file mode 100644 index 0000000..ed3ab55 --- /dev/null +++ b/src/GeekLearning.RestKit.Core/IRequestFilter.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; + +namespace GeekLearning.RestKit.Core +{ + public interface IRequestFilter + { + HttpRequestMessage Apply(HttpRequestMessage requestMessage, string[] securityDefinitions); + } +} From 62915c97b1cae4d0bc80168776010ae5a1045a87 Mon Sep 17 00:00:00 2001 From: Cyprien Autexier Date: Tue, 27 Sep 2016 16:58:33 +0200 Subject: [PATCH 2/2] change the way requestfilters are registered and instantiated to leverage DI --- src/GeekLearning.RestKit.Core/ClientBase.cs | 30 ++++++++++++------- .../ClientOptionsBase.cs | 24 ++++++++------- .../IProvideRequestFilters.cs | 2 +- .../InjectionDescriptor.cs | 14 +++++++++ 4 files changed, 49 insertions(+), 21 deletions(-) create mode 100644 src/GeekLearning.RestKit.Core/InjectionDescriptor.cs diff --git a/src/GeekLearning.RestKit.Core/ClientBase.cs b/src/GeekLearning.RestKit.Core/ClientBase.cs index e64be0a..6073014 100644 --- a/src/GeekLearning.RestKit.Core/ClientBase.cs +++ b/src/GeekLearning.RestKit.Core/ClientBase.cs @@ -1,22 +1,32 @@ -using Microsoft.Extensions.Options; -using System.Collections.Generic; -using System.Net; -using System.Net.Http; -using System.Text; -using System.Threading.Tasks; - -namespace GeekLearning.RestKit.Core +namespace GeekLearning.RestKit.Core { + using Microsoft.Extensions.Options; + using System; + using System.Linq; + using System.Collections.Generic; + using System.Net; + using System.Net.Http; + using System.Text; + using System.Threading.Tasks; + using Microsoft.Extensions.DependencyInjection; + public abstract class ClientBase where TOptions : class, IProvideRequestFilters, new() { private IMediaFormatterProvider mediaFormatterProvider; + private IServiceProvider serviceProvider; + private Lazy requestFilters; public ClientBase(IOptions options, - IMediaFormatterProvider mediaFormatterProvider) + IMediaFormatterProvider mediaFormatterProvider, + IServiceProvider serviceProvider) { this.Options = options.Value; this.mediaFormatterProvider = mediaFormatterProvider; + this.serviceProvider = serviceProvider; + this.requestFilters = new Lazy(() => + this.Options.RequestFilters.Select(x=> ActivatorUtilities.CreateInstance(this.serviceProvider, x.Type, x.Arguments)).Cast().ToArray() + ); } protected TOptions Options { get; private set; } @@ -34,7 +44,7 @@ protected Task TransformResponseAsync(HttpResponseMessage mess protected HttpRequestMessage ApplyFilters(HttpRequestMessage requestMessage, params string[] securityDefinitions) { HttpRequestMessage finalMessage = requestMessage; - foreach (var filter in this.Options.RequestFilters) + foreach (var filter in this.requestFilters.Value) { finalMessage = filter.Apply(requestMessage, securityDefinitions) ?? finalMessage; } diff --git a/src/GeekLearning.RestKit.Core/ClientOptionsBase.cs b/src/GeekLearning.RestKit.Core/ClientOptionsBase.cs index 2fb98ea..882faf1 100644 --- a/src/GeekLearning.RestKit.Core/ClientOptionsBase.cs +++ b/src/GeekLearning.RestKit.Core/ClientOptionsBase.cs @@ -1,20 +1,24 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace GeekLearning.RestKit.Core +namespace GeekLearning.RestKit.Core { + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading.Tasks; + public abstract class ClientOptionsBase : IProvideRequestFilters { - private List requestfilters = new List(); + private List requestfilters = new List(); - public void AddFilter(IRequestFilter filter) + public void AddFilter(params object[] arguments) + where TRequestFilter: IRequestFilter { - this.requestfilters.Add(filter); + this.requestfilters.Add(new InjectionDescriptor { + Type = typeof(TRequestFilter), + Arguments = arguments + }); } - public IEnumerable RequestFilters + public IEnumerable RequestFilters { get { diff --git a/src/GeekLearning.RestKit.Core/IProvideRequestFilters.cs b/src/GeekLearning.RestKit.Core/IProvideRequestFilters.cs index 5a890a6..c7153b0 100644 --- a/src/GeekLearning.RestKit.Core/IProvideRequestFilters.cs +++ b/src/GeekLearning.RestKit.Core/IProvideRequestFilters.cs @@ -7,6 +7,6 @@ namespace GeekLearning.RestKit.Core { public interface IProvideRequestFilters { - IEnumerable RequestFilters { get; } + IEnumerable RequestFilters { get; } } } diff --git a/src/GeekLearning.RestKit.Core/InjectionDescriptor.cs b/src/GeekLearning.RestKit.Core/InjectionDescriptor.cs new file mode 100644 index 0000000..b68ccdf --- /dev/null +++ b/src/GeekLearning.RestKit.Core/InjectionDescriptor.cs @@ -0,0 +1,14 @@ +namespace GeekLearning.RestKit.Core +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading.Tasks; + + + public struct InjectionDescriptor + { + public Type Type; + public object[] Arguments; + } +}