Skip to content

Commit f0fc3fd

Browse files
committed
Refactor FunctionParameterOptions to be directly injected to InvokeAsync()
1 parent 4abde5a commit f0fc3fd

13 files changed

+25
-170
lines changed

src/Sample.FunctionApp/GetArmTemplateDirectoriesHttpTrigger.cs

+2-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
using Sample.Extensions;
88
using Sample.Functions;
9-
using Sample.Functions.Extensions;
109
using Sample.Functions.FunctionFactories;
1110
using Sample.Functions.ParameterOptions;
1211

@@ -30,9 +29,9 @@ public static class GetArmTemplateDirectoriesHttpTrigger
3029
/// <returns>Returns the <see cref="HttpResponseMessage"/> instance.</returns>
3130
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger log)
3231
{
32+
var options = new GetArmTemplateDirectoriesFunctionParameterOptions() { Query = GetQuery(req) };
3333
var res = await FunctionFactory.Create<IGetArmTemplateDirectoriesFunction>(log)
34-
.AddParameters(new GetArmTemplateDirectoriesFunctionParameterOptions() { Query = GetQuery(req) })
35-
.InvokeAsync(req)
34+
.InvokeAsync(req, options)
3635
.ConfigureAwait(false);
3736
return res;
3837
}

src/Sample.Functions/Extensions/FunctionExtensions.cs

-32
This file was deleted.

src/Sample.Functions/FunctionFactories/FunctionBase.cs

+2-32
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,11 @@
66
using System.Net.Http.Formatting;
77
using System.Threading.Tasks;
88

9-
using Microsoft.Azure.WebJobs;
109
using Microsoft.Extensions.Logging;
1110
using Microsoft.Practices.ServiceLocation;
1211

1312
using Sample.Extensions;
1413
using Sample.Functions.Extensions;
15-
using Sample.Functions.ParameterOptions;
1614
using Sample.Models.Functions.Responses;
1715

1816
namespace Sample.Functions.FunctionFactories
@@ -36,31 +34,12 @@ public abstract class FunctionBase : IFunction
3634
/// </summary>
3735
public IServiceLocator ServiceLocator { get; set; }
3836

39-
/// <summary>
40-
/// Gets or sets the <see cref="FunctionParameterOptions"/> instance.
41-
/// </summary>
42-
public FunctionParameterOptions ParameterOptions { protected get; set; }
43-
44-
/// <summary>
45-
/// Invokes the function.
46-
/// </summary>
47-
/// <param name="req"><see cref="HttpRequestMessage"/> instance.</param>
48-
/// <returns>Returns the <see cref="HttpResponseMessage"/> instance.</returns>
49-
public virtual Task<HttpResponseMessage> InvokeAsync(HttpRequestMessage req)
37+
/// <inheritdoc />
38+
public virtual Task<HttpResponseMessage> InvokeAsync<TOptions>(HttpRequestMessage req, TOptions options = default(TOptions))
5039
{
5140
return null;
5241
}
5342

54-
/// <summary>
55-
/// Invokes the function.
56-
/// </summary>
57-
/// <param name="info"><see cref="TimerInfo"/> instance.</param>
58-
/// <returns>Returns the <see cref="Task"/>.</returns>
59-
public virtual Task InvokeAsync(TimerInfo info)
60-
{
61-
return Task.CompletedTask;
62-
}
63-
6443
/// <summary>
6544
/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
6645
/// </summary>
@@ -107,15 +86,6 @@ protected virtual void ReleaseUnmanagedResources()
10786
// Release unmanaged resources here.
10887
}
10988

110-
/// <summary>
111-
/// Ensures whether the <see cref="FunctionParameterOptions"/> instance has been loaded or not.
112-
/// </summary>
113-
/// <returns>Returns <c>True</c>, if <see cref="FunctionParameterOptions"/> instance has been loaded; otherwise returns <c>False</c>.</returns>
114-
protected bool EnsureParameterOptionsLoaded()
115-
{
116-
return !this.ParameterOptions.IsNullOrDefault();
117-
}
118-
11989
/// <summary>
12090
/// Checks whether the request contains payload or not.
12191
/// </summary>

src/Sample.Functions/FunctionFactories/IFunction.cs

+3-14
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Net.Http;
33
using System.Threading.Tasks;
44

5-
using Microsoft.Azure.WebJobs;
65
using Microsoft.Extensions.Logging;
76
using Microsoft.Practices.ServiceLocation;
87

@@ -25,23 +24,13 @@ public interface IFunction : IDisposable
2524
/// </summary>
2625
IServiceLocator ServiceLocator { get; set; }
2726

28-
/// <summary>
29-
/// Sets the <see cref="FunctionParameterOptions"/> instance.
30-
/// </summary>
31-
FunctionParameterOptions ParameterOptions { set; }
32-
3327
/// <summary>
3428
/// Invokes the function.
3529
/// </summary>
30+
/// <typeparam name="TOptions">Type of <see cref="FunctionParameterOptions"/>.</typeparam>
3631
/// <param name="req"><see cref="HttpRequestMessage"/> instance.</param>
32+
/// <param name="options"><see cref="TOptions"/> instance.</param>
3733
/// <returns>Returns the <see cref="HttpResponseMessage"/> instance.</returns>
38-
Task<HttpResponseMessage> InvokeAsync(HttpRequestMessage req);
39-
40-
/// <summary>
41-
/// Invokes the function.
42-
/// </summary>
43-
/// <param name="info"><see cref="TimerInfo"/> instance.</param>
44-
/// <returns>Returns the <see cref="Task"/>.</returns>
45-
Task InvokeAsync(TimerInfo info);
34+
Task<HttpResponseMessage> InvokeAsync<TOptions>(HttpRequestMessage req, TOptions options = default(TOptions));
4635
}
4736
}

src/Sample.Functions/GetArmTemplateDirectoriesFunction.cs

+5-14
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System.Linq;
2-
using System.Net.Http;
1+
using System.Net.Http;
32
using System.Threading.Tasks;
43

54
using Sample.Extensions;
@@ -25,19 +24,11 @@ public GetArmTemplateDirectoriesFunction(IGitHubService gitHubService)
2524
this._gitHubService = gitHubService.ThrowIfNullOrDefault();
2625
}
2726

28-
/// <summary>
29-
/// Gets the <see cref="GetArmTemplateDirectoriesFunctionParameterOptions"/> instance.
30-
/// </summary>
31-
public GetArmTemplateDirectoriesFunctionParameterOptions Parameters => this.ParameterOptions as GetArmTemplateDirectoriesFunctionParameterOptions;
32-
33-
/// <summary>
34-
/// Invokes the function.
35-
/// </summary>
36-
/// <param name="req"><see cref="HttpRequestMessage"/> instance.</param>
37-
/// <returns>Returns the <see cref="HttpResponseMessage"/> instance.</returns>
38-
public override async Task<HttpResponseMessage> InvokeAsync(HttpRequestMessage req)
27+
/// <inheritdoc />
28+
public override async Task<HttpResponseMessage> InvokeAsync<TOptions>(HttpRequestMessage req, TOptions options = default(TOptions))
3929
{
40-
var directories = await this._gitHubService.GetArmTemplateDirectoriesAsync(this.Parameters.Query).ConfigureAwait(false);
30+
var @params = options as GetArmTemplateDirectoriesFunctionParameterOptions;
31+
var directories = await this._gitHubService.GetArmTemplateDirectoriesAsync(@params.Query).ConfigureAwait(false);
4132

4233
return this.CreateOkResponse(req, directories);
4334
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Sample.Functions.FunctionFactories;
2-
using Sample.Functions.ParameterOptions;
32

43
namespace Sample.Functions
54
{
@@ -8,9 +7,5 @@ namespace Sample.Functions
87
/// </summary>
98
public interface IGetArmTemplateDirectoriesFunction : IFunction
109
{
11-
/// <summary>
12-
/// Gets the <see cref="GetArmTemplateDirectoriesFunctionParameterOptions"/> instance.
13-
/// </summary>
14-
GetArmTemplateDirectoriesFunctionParameterOptions Parameters { get; }
1510
}
1611
}

src/Sample.Functions/Sample.Functions.csproj

-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,6 @@
148148
</Reference>
149149
</ItemGroup>
150150
<ItemGroup>
151-
<Compile Include="Extensions\FunctionExtensions.cs" />
152151
<Compile Include="Extensions\LoggerExtensions.cs" />
153152
<Compile Include="FunctionFactories\FunctionBase.cs" />
154153
<Compile Include="FunctionFactories\FunctionFactory.cs" />

test/Sample.FunctionApp.Tests/GetArmTemplateDirectoriesHttpTriggerTests.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
using Sample.FunctionApp.Tests.Fixtures;
1111
using Sample.Functions;
12+
using Sample.Functions.ParameterOptions;
1213

1314
using Xunit;
1415

@@ -45,7 +46,7 @@ public async void Given_Instance_InvokeAsync_ShouldReturn_Response(HttpStatusCod
4546

4647
var factory = this._fixture.GetFunctionFactory(out Mock<IGetArmTemplateDirectoriesFunction> function);
4748

48-
function.Setup(p => p.InvokeAsync(It.IsAny<HttpRequestMessage>())).ReturnsAsync(this.Res);
49+
function.Setup(p => p.InvokeAsync(It.IsAny<HttpRequestMessage>(), It.IsAny<FunctionParameterOptions>())).ReturnsAsync(this.Res);
4950

5051
GetArmTemplateDirectoriesHttpTrigger.FunctionFactory = factory.Object;
5152

test/Sample.Functions.Tests/Extensions/FunctionExtensionsTests.cs

-48
This file was deleted.

test/Sample.Functions.Tests/Fixtures/FooFunction.cs

+1-10
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@ namespace Sample.Functions.Tests.Fixtures
1212
/// </summary>
1313
public interface IFooFunction : IFunction
1414
{
15-
/// <summary>
16-
/// Gets the <see cref="FooFunctionParameterOptions"/> instance.
17-
/// </summary>
18-
FooFunctionParameterOptions Parameters { get; }
1915
}
2016

2117
/// <summary>
@@ -34,13 +30,8 @@ public class FooFunctionParameterOptions : FunctionParameterOptions
3430
/// </summary>
3531
public class FooFunction : FunctionBase, IFooFunction
3632
{
37-
/// <summary>
38-
/// Gets the <see cref="FooFunctionParameterOptions"/> instance.
39-
/// </summary>
40-
public FooFunctionParameterOptions Parameters => this.ParameterOptions as FooFunctionParameterOptions;
41-
4233
/// <inheritdoc />
43-
public override Task<HttpResponseMessage> InvokeAsync(HttpRequestMessage req)
34+
public override Task<HttpResponseMessage> InvokeAsync<TOptions>(HttpRequestMessage req, TOptions options = default(TOptions))
4435
{
4536
throw new NotImplementedException();
4637
}

test/Sample.Functions.Tests/Fixtures/FunctionFixture.cs

+1-5
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66

77
using Moq;
88

9-
using Sample.Functions.Extensions;
109
using Sample.Functions.FunctionFactories;
11-
using Sample.Functions.ParameterOptions;
1210
using Sample.Models.Settings;
1311
using Sample.Services;
1412

@@ -76,15 +74,13 @@ public FunctionFixture()
7674
/// <summary>
7775
/// Arranges the <see cref="IGetArmTemplateDirectoriesFunction"/> instance.
7876
/// </summary>
79-
/// <param name="query">Query to filter out directories.</param>
8077
/// <param name="gitHubService"><see cref="Mock{IGitHubService}"/> instance.</param>
8178
/// <returns>Returns the <see cref="IGetArmTemplateDirectoriesFunction"/> instance.</returns>
82-
public IGetArmTemplateDirectoriesFunction ArrangeGetArmTemplateDirectoriesFunction(string query, out Mock<IGitHubService> gitHubService)
79+
public IGetArmTemplateDirectoriesFunction ArrangeGetArmTemplateDirectoriesFunction(out Mock<IGitHubService> gitHubService)
8380
{
8481
gitHubService = new Mock<IGitHubService>();
8582

8683
var function = new GetArmTemplateDirectoriesFunction(gitHubService.Object)
87-
.AddParameters(new GetArmTemplateDirectoriesFunctionParameterOptions() { Query = query })
8884
.SetLoggerToFixture(this.Log)
8985
.SetServiceLocatorToFixture(this.ServiceLocator);
9086

test/Sample.Functions.Tests/GetArmTemplateDirectoriesFunctionTests.cs

+9-4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Moq;
1010

1111
using Sample.Extensions;
12+
using Sample.Functions.ParameterOptions;
1213
using Sample.Functions.Tests.Fixtures;
1314
using Sample.Models.Enums;
1415
using Sample.Models.GitHub;
@@ -60,11 +61,13 @@ public async void Given_NoQueryString_InvokeAsync_ShouldReturn_Result(string nam
6061

6162
this.Req = this.CreateRequest("http://localhost");
6263

63-
var function = this._fixture.ArrangeGetArmTemplateDirectoriesFunction(null, out Mock<IGitHubService> gitHubService);
64+
var function = this._fixture.ArrangeGetArmTemplateDirectoriesFunction(out Mock<IGitHubService> gitHubService);
6465

6566
gitHubService.Setup(p => p.GetArmTemplateDirectoriesAsync(It.IsAny<string>())).ReturnsAsync(models);
6667

67-
this.Res = await function.InvokeAsync(this.Req).ConfigureAwait(false);
68+
var options = new GetArmTemplateDirectoriesFunctionParameterOptions();
69+
70+
this.Res = await function.InvokeAsync(this.Req, options).ConfigureAwait(false);
6871
this.Res.StatusCode.Should().Be(HttpStatusCode.OK);
6972

7073
var result = await this.Res.Content.ReadAsAsync<List<ContentModel>>().ConfigureAwait(false);
@@ -92,12 +95,14 @@ public async void Given_QueryString_InvokeAsync_ShouldReturn_Result(string name,
9295

9396
this.Req = this.CreateRequest($"http://localhost?q={query}");
9497

95-
var function = this._fixture.ArrangeGetArmTemplateDirectoriesFunction(query, out Mock<IGitHubService> gitHubService);
98+
var function = this._fixture.ArrangeGetArmTemplateDirectoriesFunction(out Mock<IGitHubService> gitHubService);
9699

97100
gitHubService.Setup(p => p.GetArmTemplateDirectoriesAsync(It.IsAny<string>()))
98101
.ReturnsAsync(models.Where(p => p.Name.ContainsEquivalent(query)).ToList);
99102

100-
this.Res = await function.InvokeAsync(this.Req).ConfigureAwait(false);
103+
var options = new GetArmTemplateDirectoriesFunctionParameterOptions() { Query = query };
104+
105+
this.Res = await function.InvokeAsync(this.Req, options).ConfigureAwait(false);
101106
this.Res.StatusCode.Should().Be(HttpStatusCode.OK);
102107

103108
var result = await this.Res.Content.ReadAsAsync<List<ContentModel>>().ConfigureAwait(false);

test/Sample.Functions.Tests/Sample.Functions.Tests.csproj

-1
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,6 @@
183183
</Reference>
184184
</ItemGroup>
185185
<ItemGroup>
186-
<Compile Include="Extensions\FunctionExtensionsTests.cs" />
187186
<Compile Include="Extensions\LoggerExtensionsTests.cs" />
188187
<Compile Include="Fixtures\AppModuleFixture.cs" />
189188
<Compile Include="Fixtures\FooFunction.cs" />

0 commit comments

Comments
 (0)