Skip to content
This repository was archived by the owner on Nov 20, 2018. It is now read-only.

Commit 19e42a4

Browse files
committed
Adding option to configure services when exposing the ASP.NET 5 pipeline via OWIN #398
1 parent 690e5a6 commit 19e42a4

File tree

4 files changed

+104
-6
lines changed

4 files changed

+104
-6
lines changed

src/Microsoft.AspNet.Owin/OwinExtensions.cs

+16-5
Original file line numberDiff line numberDiff line change
@@ -66,22 +66,27 @@ public static IApplicationBuilder UseOwin(this IApplicationBuilder builder, Acti
6666
}
6767

6868
public static IApplicationBuilder UseBuilder(this AddMiddleware app)
69+
{
70+
return app.UseBuilder(serviceProvider: null);
71+
}
72+
73+
public static IApplicationBuilder UseBuilder(this AddMiddleware app, IServiceProvider serviceProvider)
6974
{
7075
// Adapt WebSockets by default.
7176
app(OwinWebSocketAcceptAdapter.AdaptWebSockets);
72-
var builder = new ApplicationBuilder(serviceProvider: null);
77+
var builder = new ApplicationBuilder(serviceProvider: serviceProvider);
7378

74-
CreateMiddleware middleware = CreateMiddlewareFactory(exit =>
79+
var middleware = CreateMiddlewareFactory(exit =>
7580
{
7681
builder.Use(ignored => exit);
7782
return builder.Build();
78-
});
83+
}, builder.ApplicationServices);
7984

8085
app(middleware);
8186
return builder;
8287
}
8388

84-
private static CreateMiddleware CreateMiddlewareFactory(Func<RequestDelegate, RequestDelegate> middleware)
89+
private static CreateMiddleware CreateMiddlewareFactory(Func<RequestDelegate, RequestDelegate> middleware, IServiceProvider applicationServices)
8590
{
8691
return next =>
8792
{
@@ -105,6 +110,7 @@ private static CreateMiddleware CreateMiddlewareFactory(Func<RequestDelegate, Re
105110
context = new DefaultHttpContext(
106111
new FeatureCollection(
107112
new OwinFeatureCollection(env)));
113+
context.ApplicationServices = applicationServices;
108114
}
109115

110116
return app.Invoke(context);
@@ -114,7 +120,12 @@ private static CreateMiddleware CreateMiddlewareFactory(Func<RequestDelegate, Re
114120

115121
public static AddMiddleware UseBuilder(this AddMiddleware app, Action<IApplicationBuilder> pipeline)
116122
{
117-
var builder = app.UseBuilder();
123+
return app.UseBuilder(pipeline, serviceProvider: null);
124+
}
125+
126+
public static AddMiddleware UseBuilder(this AddMiddleware app, Action<IApplicationBuilder> pipeline, IServiceProvider serviceProvider)
127+
{
128+
var builder = app.UseBuilder(serviceProvider);
118129
pipeline(builder);
119130
return app;
120131
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using System.Linq;
7+
using System.Threading.Tasks;
8+
using Microsoft.AspNet.Builder;
9+
using Microsoft.Extensions.DependencyInjection;
10+
using Xunit;
11+
12+
namespace Microsoft.AspNet.Owin
13+
{
14+
using AppFunc = Func<IDictionary<string, object>, Task>;
15+
using CreateMiddleware = Func<
16+
Func<IDictionary<string, object>, Task>,
17+
Func<IDictionary<string, object>, Task>
18+
>;
19+
using AddMiddleware = Action<Func<
20+
Func<IDictionary<string, object>, Task>,
21+
Func<IDictionary<string, object>, Task>
22+
>>;
23+
24+
public class OwinExtensionTests
25+
{
26+
static AppFunc notFound = env => new Task(() => { env["owin.ResponseStatusCode"] = 404; });
27+
28+
[Fact]
29+
public void OwinConfigureServiceProviderAddsServices()
30+
{
31+
var list = new List<CreateMiddleware>();
32+
AddMiddleware build = list.Add;
33+
IServiceProvider serviceProvider = null;
34+
FakeService fakeService = null;
35+
36+
var builder = build.UseBuilder(applicationBuilder =>
37+
{
38+
serviceProvider = applicationBuilder.ApplicationServices;
39+
applicationBuilder.Run(async context =>
40+
{
41+
fakeService = context.ApplicationServices.GetService<FakeService>();
42+
});
43+
}, new ServiceCollection().AddSingleton(new FakeService()).BuildServiceProvider());
44+
45+
list.Reverse();
46+
list.Aggregate(notFound, (next, middleware) => middleware(next)).Invoke(new Dictionary<string, object>());
47+
48+
Assert.NotNull(fakeService);
49+
Assert.NotNull(serviceProvider.GetService<FakeService>());
50+
}
51+
52+
[Fact]
53+
public void OwinDefaultNoServices()
54+
{
55+
var list = new List<CreateMiddleware>();
56+
AddMiddleware build = list.Add;
57+
IServiceProvider serviceProvider = null;
58+
FakeService fakeService = null;
59+
bool builderExecuted = false;
60+
bool applicationExecuted = false;
61+
62+
var builder = build.UseBuilder(applicationBuilder =>
63+
{
64+
builderExecuted = true;
65+
serviceProvider = applicationBuilder.ApplicationServices;
66+
applicationBuilder.Run(async context =>
67+
{
68+
applicationExecuted = true;
69+
fakeService = context.ApplicationServices.GetService<FakeService>();
70+
});
71+
});
72+
73+
list.Reverse();
74+
list.Aggregate(notFound, (next, middleware) => middleware(next)).Invoke(new Dictionary<string, object>());
75+
76+
Assert.True(builderExecuted);
77+
Assert.Null(fakeService);
78+
Assert.True(applicationExecuted);
79+
Assert.Null(serviceProvider);
80+
}
81+
82+
private class FakeService
83+
{
84+
85+
}
86+
}
87+
}

test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System.Collections.Generic;
5-
using System.Linq;
65
using Microsoft.AspNet.Http.Features;
76
using Xunit;
87

test/Microsoft.AspNet.Owin.Tests/project.json

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"dependencies": {
33
"Microsoft.AspNet.Http": "1.0.0-*",
44
"Microsoft.AspNet.Owin": "1.0.0-*",
5+
"Microsoft.Extensions.DependencyInjection": "1.0.0-*",
56
"xunit.runner.aspnet": "2.0.0-aspnet-*"
67
},
78
"commands": {

0 commit comments

Comments
 (0)