Skip to content

Commit fbdcefb

Browse files
author
Bart Koelman
committed
Removed RequestScopedServiceProvider
1 parent 05f155e commit fbdcefb

8 files changed

+26
-129
lines changed

src/JsonApiDotNetCore/Configuration/IRequestScopedServiceProvider.cs

Lines changed: 0 additions & 12 deletions
This file was deleted.

src/JsonApiDotNetCore/Configuration/JsonApiApplicationBuilder.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,6 @@ private void AddMiddlewareLayer()
175175
_services.AddSingleton<IJsonApiRoutingConvention, JsonApiRoutingConvention>();
176176
_services.AddSingleton<IControllerResourceMapping>(sp => sp.GetRequiredService<IJsonApiRoutingConvention>());
177177
_services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
178-
_services.AddSingleton<IRequestScopedServiceProvider, RequestScopedServiceProvider>();
179178
_services.AddScoped<IJsonApiRequest, JsonApiRequest>();
180179
_services.AddScoped<IJsonApiWriter, JsonApiWriter>();
181180
_services.AddScoped<IJsonApiReader, JsonApiReader>();

src/JsonApiDotNetCore/Configuration/JsonApiModelMetadataProvider.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using Microsoft.AspNetCore.Http;
12
using Microsoft.AspNetCore.Mvc;
23
using Microsoft.AspNetCore.Mvc.ModelBinding;
34
using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
@@ -13,18 +14,18 @@ internal sealed class JsonApiModelMetadataProvider : DefaultModelMetadataProvide
1314
private readonly JsonApiValidationFilter _jsonApiValidationFilter;
1415

1516
/// <inheritdoc />
16-
public JsonApiModelMetadataProvider(ICompositeMetadataDetailsProvider detailsProvider, IRequestScopedServiceProvider serviceProvider)
17+
public JsonApiModelMetadataProvider(ICompositeMetadataDetailsProvider detailsProvider, IHttpContextAccessor httpContextAccessor)
1718
: base(detailsProvider)
1819
{
19-
_jsonApiValidationFilter = new JsonApiValidationFilter(serviceProvider);
20+
_jsonApiValidationFilter = new JsonApiValidationFilter(httpContextAccessor);
2021
}
2122

2223
/// <inheritdoc />
2324
public JsonApiModelMetadataProvider(ICompositeMetadataDetailsProvider detailsProvider, IOptions<MvcOptions> optionsAccessor,
24-
IRequestScopedServiceProvider serviceProvider)
25+
IHttpContextAccessor httpContextAccessor)
2526
: base(detailsProvider, optionsAccessor)
2627
{
27-
_jsonApiValidationFilter = new JsonApiValidationFilter(serviceProvider);
28+
_jsonApiValidationFilter = new JsonApiValidationFilter(httpContextAccessor);
2829
}
2930

3031
/// <inheritdoc />

src/JsonApiDotNetCore/Configuration/JsonApiValidationFilter.cs

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,19 +13,21 @@ namespace JsonApiDotNetCore.Configuration
1313
/// </summary>
1414
internal sealed class JsonApiValidationFilter : IPropertyValidationFilter
1515
{
16-
private readonly IRequestScopedServiceProvider _serviceProvider;
16+
private readonly IHttpContextAccessor _httpContextAccessor;
1717

18-
public JsonApiValidationFilter(IRequestScopedServiceProvider serviceProvider)
18+
public JsonApiValidationFilter(IHttpContextAccessor httpContextAccessor)
1919
{
20-
ArgumentGuard.NotNull(serviceProvider, nameof(serviceProvider));
20+
ArgumentGuard.NotNull(httpContextAccessor, nameof(httpContextAccessor));
2121

22-
_serviceProvider = serviceProvider;
22+
_httpContextAccessor = httpContextAccessor;
2323
}
2424

2525
/// <inheritdoc />
2626
public bool ShouldValidateEntry(ValidationEntry entry, ValidationEntry parentEntry)
2727
{
28-
var request = _serviceProvider.GetRequiredService<IJsonApiRequest>();
28+
IServiceProvider serviceProvider = GetServiceProvider();
29+
30+
var request = serviceProvider.GetRequiredService<IJsonApiRequest>();
2931

3032
if (IsId(entry.Key))
3133
{
@@ -39,17 +41,27 @@ public bool ShouldValidateEntry(ValidationEntry entry, ValidationEntry parentEnt
3941
return false;
4042
}
4143

42-
var httpContextAccessor = _serviceProvider.GetRequiredService<IHttpContextAccessor>();
43-
44-
if (httpContextAccessor.HttpContext!.Request.Method == HttpMethods.Patch || request.WriteOperation == WriteOperationKind.UpdateResource)
44+
if (_httpContextAccessor.HttpContext!.Request.Method == HttpMethods.Patch || request.WriteOperation == WriteOperationKind.UpdateResource)
4545
{
46-
var targetedFields = _serviceProvider.GetRequiredService<ITargetedFields>();
46+
var targetedFields = serviceProvider.GetRequiredService<ITargetedFields>();
4747
return IsFieldTargeted(entry, targetedFields);
4848
}
4949

5050
return true;
5151
}
5252

53+
private IServiceProvider GetServiceProvider()
54+
{
55+
HttpContext httpContext = _httpContextAccessor.HttpContext;
56+
57+
if (httpContext == null)
58+
{
59+
throw new InvalidOperationException("Cannot resolve scoped services outside the context of an HTTP request.");
60+
}
61+
62+
return httpContext.RequestServices;
63+
}
64+
5365
private static bool IsId(string key)
5466
{
5567
return key == nameof(Identifiable.Id) || key.EndsWith($".{nameof(Identifiable.Id)}", StringComparison.Ordinal);

src/JsonApiDotNetCore/Configuration/RequestScopedServiceProvider.cs

Lines changed: 0 additions & 34 deletions
This file was deleted.

test/UnitTests/Extensions/ServiceCollectionExtensionsTests.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@ public void RegisterResource_DeviatingDbContextPropertyName_RegistersCorrectly()
2929
services.AddLogging();
3030
services.AddDbContext<TestDbContext>(options => options.UseInMemoryDatabase("UnitTestDb"));
3131

32-
// this is required because the DbContextResolver requires access to the current HttpContext
33-
// to get the request scoped DbContext instance
34-
services.AddScoped<IRequestScopedServiceProvider, TestScopedServiceProvider>();
35-
3632
// Act
3733
services.AddJsonApi<TestDbContext>();
3834

@@ -171,8 +167,6 @@ public void AddJsonApi_With_Context_Uses_Resource_Type_Name_If_NoOtherSpecified(
171167
services.AddLogging();
172168
services.AddDbContext<TestDbContext>(options => options.UseInMemoryDatabase(Guid.NewGuid().ToString()));
173169

174-
services.AddScoped<IRequestScopedServiceProvider, TestScopedServiceProvider>();
175-
176170
// Act
177171
services.AddJsonApi<TestDbContext>();
178172

test/UnitTests/Internal/RequestScopedServiceProviderTests.cs

Lines changed: 0 additions & 35 deletions
This file was deleted.

test/UnitTests/TestScopedServiceProvider.cs

Lines changed: 0 additions & 28 deletions
This file was deleted.

0 commit comments

Comments
 (0)