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

Commit 35e25ee

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

File tree

4 files changed

+97
-6
lines changed

4 files changed

+97
-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,80 @@
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+
13+
namespace Microsoft.AspNet.Owin
14+
{
15+
using AppFunc = Func<IDictionary<string, object>, Task>;
16+
using CreateMiddleware = Func<
17+
Func<IDictionary<string, object>, Task>,
18+
Func<IDictionary<string, object>, Task>
19+
>;
20+
using AddMiddleware = Action<Func<
21+
Func<IDictionary<string, object>, Task>,
22+
Func<IDictionary<string, object>, Task>
23+
>>;
24+
25+
public class OwinExtensionTests
26+
{
27+
static AppFunc notFound = async env => env["owin.ResponseStatusCode"] = 404;
28+
29+
[Fact]
30+
public void OwinConfigureServiceProviderAddsServices()
31+
{
32+
IList<CreateMiddleware> list = new List<CreateMiddleware>();
33+
AddMiddleware build = list.Add;
34+
IServiceProvider serviceProvider = null;
35+
FakeService fakeService = null;
36+
37+
var builder = build.UseBuilder(applicationBuilder =>
38+
{
39+
serviceProvider = applicationBuilder.ApplicationServices;
40+
applicationBuilder.Run(async context =>
41+
{
42+
fakeService = context.ApplicationServices.GetService<FakeService>();
43+
});
44+
}, new ServiceCollection().AddSingleton(new FakeService()).BuildServiceProvider());
45+
46+
list.Reverse().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+
IList<CreateMiddleware> list = new List<CreateMiddleware>();
56+
AddMiddleware build = list.Add;
57+
IServiceProvider serviceProvider = null;
58+
FakeService fakeService = null;
59+
60+
var builder = build.UseBuilder(applicationBuilder =>
61+
{
62+
serviceProvider = applicationBuilder.ApplicationServices;
63+
applicationBuilder.Run(async context =>
64+
{
65+
fakeService = context.ApplicationServices.GetService<FakeService>();
66+
});
67+
});
68+
69+
list.Reverse().Aggregate(notFound, (next, middleware) => middleware(next)).Invoke(new Dictionary<string, object>());
70+
71+
Assert.Null(fakeService);
72+
Assert.Null(serviceProvider);
73+
}
74+
75+
public class FakeService
76+
{
77+
78+
}
79+
}
80+
}

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)