Skip to content

Commit 62915c9

Browse files
committed
change the way requestfilters are registered and instantiated to leverage DI
1 parent 6ea6afb commit 62915c9

File tree

4 files changed

+49
-21
lines changed

4 files changed

+49
-21
lines changed

src/GeekLearning.RestKit.Core/ClientBase.cs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,32 @@
1-
using Microsoft.Extensions.Options;
2-
using System.Collections.Generic;
3-
using System.Net;
4-
using System.Net.Http;
5-
using System.Text;
6-
using System.Threading.Tasks;
7-
8-
namespace GeekLearning.RestKit.Core
1+
namespace GeekLearning.RestKit.Core
92
{
3+
using Microsoft.Extensions.Options;
4+
using System;
5+
using System.Linq;
6+
using System.Collections.Generic;
7+
using System.Net;
8+
using System.Net.Http;
9+
using System.Text;
10+
using System.Threading.Tasks;
11+
using Microsoft.Extensions.DependencyInjection;
12+
1013
public abstract class ClientBase<TOptions>
1114
where TOptions : class, IProvideRequestFilters, new()
1215
{
1316
private IMediaFormatterProvider mediaFormatterProvider;
17+
private IServiceProvider serviceProvider;
18+
private Lazy<IRequestFilter[]> requestFilters;
1419

1520
public ClientBase(IOptions<TOptions> options,
16-
IMediaFormatterProvider mediaFormatterProvider)
21+
IMediaFormatterProvider mediaFormatterProvider,
22+
IServiceProvider serviceProvider)
1723
{
1824
this.Options = options.Value;
1925
this.mediaFormatterProvider = mediaFormatterProvider;
26+
this.serviceProvider = serviceProvider;
27+
this.requestFilters = new Lazy<IRequestFilter[]>(() =>
28+
this.Options.RequestFilters.Select(x=> ActivatorUtilities.CreateInstance(this.serviceProvider, x.Type, x.Arguments)).Cast<IRequestFilter>().ToArray()
29+
);
2030
}
2131

2232
protected TOptions Options { get; private set; }
@@ -34,7 +44,7 @@ protected Task<TTarget> TransformResponseAsync<TTarget>(HttpResponseMessage mess
3444
protected HttpRequestMessage ApplyFilters(HttpRequestMessage requestMessage, params string[] securityDefinitions)
3545
{
3646
HttpRequestMessage finalMessage = requestMessage;
37-
foreach (var filter in this.Options.RequestFilters)
47+
foreach (var filter in this.requestFilters.Value)
3848
{
3949
finalMessage = filter.Apply(requestMessage, securityDefinitions) ?? finalMessage;
4050
}

src/GeekLearning.RestKit.Core/ClientOptionsBase.cs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Threading.Tasks;
5-
6-
namespace GeekLearning.RestKit.Core
1+
namespace GeekLearning.RestKit.Core
72
{
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Threading.Tasks;
7+
88
public abstract class ClientOptionsBase : IProvideRequestFilters
99
{
10-
private List<IRequestFilter> requestfilters = new List<IRequestFilter>();
10+
private List<InjectionDescriptor> requestfilters = new List<InjectionDescriptor>();
1111

12-
public void AddFilter(IRequestFilter filter)
12+
public void AddFilter<TRequestFilter>(params object[] arguments)
13+
where TRequestFilter: IRequestFilter
1314
{
14-
this.requestfilters.Add(filter);
15+
this.requestfilters.Add(new InjectionDescriptor {
16+
Type = typeof(TRequestFilter),
17+
Arguments = arguments
18+
});
1519
}
1620

17-
public IEnumerable<IRequestFilter> RequestFilters
21+
public IEnumerable<InjectionDescriptor> RequestFilters
1822
{
1923
get
2024
{

src/GeekLearning.RestKit.Core/IProvideRequestFilters.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ namespace GeekLearning.RestKit.Core
77
{
88
public interface IProvideRequestFilters
99
{
10-
IEnumerable<IRequestFilter> RequestFilters { get; }
10+
IEnumerable<InjectionDescriptor> RequestFilters { get; }
1111
}
1212
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace GeekLearning.RestKit.Core
2+
{
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Threading.Tasks;
7+
8+
9+
public struct InjectionDescriptor
10+
{
11+
public Type Type;
12+
public object[] Arguments;
13+
}
14+
}

0 commit comments

Comments
 (0)