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

Commit

Permalink
Adding option to configure services when exposing the ASP.NET 5 pipel…
Browse files Browse the repository at this point in the history
…ine via OWIN #398
  • Loading branch information
JunTaoLuo committed Nov 17, 2015
1 parent 690e5a6 commit 35e25ee
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 6 deletions.
21 changes: 16 additions & 5 deletions src/Microsoft.AspNet.Owin/OwinExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,22 +66,27 @@ public static IApplicationBuilder UseOwin(this IApplicationBuilder builder, Acti
}

public static IApplicationBuilder UseBuilder(this AddMiddleware app)
{
return app.UseBuilder(serviceProvider: null);
}

public static IApplicationBuilder UseBuilder(this AddMiddleware app, IServiceProvider serviceProvider)
{
// Adapt WebSockets by default.
app(OwinWebSocketAcceptAdapter.AdaptWebSockets);
var builder = new ApplicationBuilder(serviceProvider: null);
var builder = new ApplicationBuilder(serviceProvider: serviceProvider);

CreateMiddleware middleware = CreateMiddlewareFactory(exit =>
var middleware = CreateMiddlewareFactory(exit =>
{
builder.Use(ignored => exit);
return builder.Build();
});
}, builder.ApplicationServices);

app(middleware);
return builder;
}

private static CreateMiddleware CreateMiddlewareFactory(Func<RequestDelegate, RequestDelegate> middleware)
private static CreateMiddleware CreateMiddlewareFactory(Func<RequestDelegate, RequestDelegate> middleware, IServiceProvider applicationServices)
{
return next =>
{
Expand All @@ -105,6 +110,7 @@ private static CreateMiddleware CreateMiddlewareFactory(Func<RequestDelegate, Re
context = new DefaultHttpContext(
new FeatureCollection(
new OwinFeatureCollection(env)));
context.ApplicationServices = applicationServices;
}

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

public static AddMiddleware UseBuilder(this AddMiddleware app, Action<IApplicationBuilder> pipeline)
{
var builder = app.UseBuilder();
return app.UseBuilder(pipeline, serviceProvider: null);
}

public static AddMiddleware UseBuilder(this AddMiddleware app, Action<IApplicationBuilder> pipeline, IServiceProvider serviceProvider)
{
var builder = app.UseBuilder(serviceProvider);
pipeline(builder);
return app;
}
Expand Down
80 changes: 80 additions & 0 deletions test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Builder;
using Microsoft.Extensions.DependencyInjection;
using Xunit;


namespace Microsoft.AspNet.Owin
{
using AppFunc = Func<IDictionary<string, object>, Task>;
using CreateMiddleware = Func<
Func<IDictionary<string, object>, Task>,
Func<IDictionary<string, object>, Task>
>;
using AddMiddleware = Action<Func<
Func<IDictionary<string, object>, Task>,
Func<IDictionary<string, object>, Task>
>>;

public class OwinExtensionTests
{
static AppFunc notFound = async env => env["owin.ResponseStatusCode"] = 404;

[Fact]
public void OwinConfigureServiceProviderAddsServices()
{
IList<CreateMiddleware> list = new List<CreateMiddleware>();
AddMiddleware build = list.Add;
IServiceProvider serviceProvider = null;
FakeService fakeService = null;

var builder = build.UseBuilder(applicationBuilder =>
{
serviceProvider = applicationBuilder.ApplicationServices;
applicationBuilder.Run(async context =>
{
fakeService = context.ApplicationServices.GetService<FakeService>();
});
}, new ServiceCollection().AddSingleton(new FakeService()).BuildServiceProvider());

list.Reverse().Aggregate(notFound, (next, middleware) => middleware(next)).Invoke(new Dictionary<string, object>());

Assert.NotNull(fakeService);
Assert.NotNull(serviceProvider?.GetService<FakeService>());
}

[Fact]
public void OwinDefaultNoServices()
{
IList<CreateMiddleware> list = new List<CreateMiddleware>();
AddMiddleware build = list.Add;
IServiceProvider serviceProvider = null;
FakeService fakeService = null;

var builder = build.UseBuilder(applicationBuilder =>
{
serviceProvider = applicationBuilder.ApplicationServices;
applicationBuilder.Run(async context =>
{
fakeService = context.ApplicationServices.GetService<FakeService>();
});
});

list.Reverse().Aggregate(notFound, (next, middleware) => middleware(next)).Invoke(new Dictionary<string, object>());

Assert.Null(fakeService);
Assert.Null(serviceProvider);
}

public class FakeService
{

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNet.Http.Features;
using Xunit;

Expand Down
1 change: 1 addition & 0 deletions test/Microsoft.AspNet.Owin.Tests/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"dependencies": {
"Microsoft.AspNet.Http": "1.0.0-*",
"Microsoft.AspNet.Owin": "1.0.0-*",
"Microsoft.Extensions.DependencyInjection": "1.0.0-*",
"xunit.runner.aspnet": "2.0.0-aspnet-*"
},
"commands": {
Expand Down

0 comments on commit 35e25ee

Please sign in to comment.