Skip to content

Commit a4992da

Browse files
committed
Fix handling of per-request singletons in ASP.NET Core
1 parent 8b429be commit a4992da

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

src/React.AspNet/HttpContextLifetimeProvider.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,22 @@ namespace React.AspNet
2222
/// </summary>
2323
internal class HttpContextLifetimeProvider : TinyIoCContainer.ITinyIoCObjectLifetimeProvider
2424
{
25-
private readonly IServiceProvider _appServiceProvider;
25+
private readonly IHttpContextAccessor _httpContextAccessor;
2626

2727
/// <summary>
2828
/// Creates a new <see cref="HttpContextLifetimeProvider" />.
2929
/// </summary>
30-
/// <param name="appServiceProvider">ASP.NET dependency injection service provider</param>
31-
public HttpContextLifetimeProvider(IServiceProvider appServiceProvider)
30+
public HttpContextLifetimeProvider(IHttpContextAccessor httpContextAccessor)
3231
{
33-
_appServiceProvider = appServiceProvider;
32+
if (httpContextAccessor == null)
33+
{
34+
throw new ReactNotInitialisedException(
35+
"IHttpContextAccessor is not registered correctly. Please add it to your " +
36+
"application startup:\n" +
37+
"services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();"
38+
);
39+
}
40+
_httpContextAccessor = httpContextAccessor;
3441
}
3542

3643
/// <summary>
@@ -50,7 +57,8 @@ private PerRequestRegistrations Registrations
5057
{
5158
get
5259
{
53-
var registrations = _appServiceProvider.GetService<PerRequestRegistrations>();
60+
var requestServices = _httpContextAccessor.HttpContext.RequestServices;
61+
var registrations = requestServices.GetService<PerRequestRegistrations>();
5462
if (registrations == null)
5563
{
5664
throw new ReactNotInitialisedException(

src/React.AspNet/ReactBuilderExtensions.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using System;
1111
using Microsoft.AspNetCore.Builder;
1212
using Microsoft.AspNetCore.Hosting;
13+
using Microsoft.AspNetCore.Http;
1314
using Microsoft.Extensions.PlatformAbstractions;
1415
using React.Exceptions;
1516
using React.TinyIoC;
@@ -39,7 +40,10 @@ public static IApplicationBuilder UseReact(
3940

4041
React.AssemblyRegistration.Container.Register(app.ApplicationServices.GetRequiredService<IHostingEnvironment>());
4142

42-
Initializer.Initialize(registerOptions => AsPerRequestSingleton(app.ApplicationServices, registerOptions));
43+
Initializer.Initialize(registerOptions => AsPerRequestSingleton(
44+
app.ApplicationServices.GetService<IHttpContextAccessor>(),
45+
registerOptions
46+
));
4347
configure(ReactSiteConfiguration.Configuration);
4448

4549
// Allow serving of .jsx files
@@ -55,13 +59,13 @@ public static IApplicationBuilder UseReact(
5559
/// <param name="registerOptions">Registration options</param>
5660
/// <returns>Registration options (for chaining)</returns>
5761
private static TinyIoCContainer.RegisterOptions AsPerRequestSingleton(
58-
IServiceProvider appServiceProvider,
62+
IHttpContextAccessor httpContextAccessor,
5963
TinyIoCContainer.RegisterOptions registerOptions
6064
)
6165
{
6266
return TinyIoCContainer.RegisterOptions.ToCustomLifetimeManager(
6367
registerOptions,
64-
new HttpContextLifetimeProvider(appServiceProvider),
68+
new HttpContextLifetimeProvider(httpContextAccessor),
6569
"per request singleton"
6670
);
6771
}

src/React.Sample.Mvc6/Startup.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
using Microsoft.AspNetCore.Builder;
1111
using Microsoft.AspNetCore.Hosting;
12+
using Microsoft.AspNetCore.Http;
1213
using Microsoft.Extensions.Configuration;
1314
using Microsoft.Extensions.DependencyInjection;
1415
using Microsoft.Extensions.Logging;
@@ -34,6 +35,8 @@ public void ConfigureServices(IServiceCollection services)
3435
// Add MVC services to the services container.
3536
services.AddMvc();
3637

38+
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
39+
3740
// Add ReactJS.NET services.
3841
services.AddReact();
3942
}

0 commit comments

Comments
 (0)