Skip to content

Commit 29e5c84

Browse files
author
Bart Koelman
committed
Removed single-parameter resource definitions
1 parent d294ead commit 29e5c84

21 files changed

+126
-182
lines changed

benchmarks/Deserialization/DeserializationBenchmarkBase.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ protected DeserializationBenchmarkBase()
3030
var resourceDefinitionAccessor = new ResourceDefinitionAccessor(resourceGraph, serviceContainer);
3131

3232
serviceContainer.AddService(typeof(IResourceDefinitionAccessor), resourceDefinitionAccessor);
33-
serviceContainer.AddService(typeof(IResourceDefinition<ResourceA>), new JsonApiResourceDefinition<ResourceA>(resourceGraph));
33+
serviceContainer.AddService(typeof(IResourceDefinition<ResourceA, int>), new JsonApiResourceDefinition<ResourceA, int>(resourceGraph));
3434

3535
// ReSharper disable once VirtualMemberCallInConstructor
3636
JsonApiRequest request = CreateJsonApiRequest(resourceGraph);

src/Examples/JsonApiDotNetCoreExample/Definitions/TodoItemDefinition.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
namespace JsonApiDotNetCoreExample.Definitions
1313
{
1414
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
15-
public sealed class TodoItemDefinition : JsonApiResourceDefinition<TodoItem>
15+
public sealed class TodoItemDefinition : JsonApiResourceDefinition<TodoItem, int>
1616
{
1717
private readonly ISystemClock _systemClock;
1818

src/JsonApiDotNetCore/Configuration/JsonApiApplicationBuilder.cs

+4-9
Original file line numberDiff line numberDiff line change
@@ -181,33 +181,28 @@ private void AddMiddlewareLayer()
181181

182182
private void AddResourceLayer()
183183
{
184-
RegisterImplementationForOpenInterfaces(ServiceDiscoveryFacade.ResourceDefinitionInterfaces, typeof(JsonApiResourceDefinition<>),
185-
typeof(JsonApiResourceDefinition<,>));
184+
RegisterImplementationForOpenInterfaces(ServiceDiscoveryFacade.ResourceDefinitionInterfaces, typeof(JsonApiResourceDefinition<,>));
186185

187186
_services.AddScoped<IResourceDefinitionAccessor, ResourceDefinitionAccessor>();
188187
_services.AddScoped<IResourceFactory, ResourceFactory>();
189188
}
190189

191190
private void AddRepositoryLayer()
192191
{
193-
RegisterImplementationForOpenInterfaces(ServiceDiscoveryFacade.RepositoryInterfaces, null, typeof(EntityFrameworkCoreRepository<,>));
192+
RegisterImplementationForOpenInterfaces(ServiceDiscoveryFacade.RepositoryInterfaces, typeof(EntityFrameworkCoreRepository<,>));
194193

195194
_services.AddScoped<IResourceRepositoryAccessor, ResourceRepositoryAccessor>();
196195
}
197196

198197
private void AddServiceLayer()
199198
{
200-
RegisterImplementationForOpenInterfaces(ServiceDiscoveryFacade.ServiceInterfaces, null, typeof(JsonApiResourceService<,>));
199+
RegisterImplementationForOpenInterfaces(ServiceDiscoveryFacade.ServiceInterfaces, typeof(JsonApiResourceService<,>));
201200
}
202201

203-
private void RegisterImplementationForOpenInterfaces(HashSet<Type> openGenericInterfaces, Type intImplementation, Type implementation)
202+
private void RegisterImplementationForOpenInterfaces(HashSet<Type> openGenericInterfaces, Type implementationType)
204203
{
205204
foreach (Type openGenericInterface in openGenericInterfaces)
206205
{
207-
Type implementationType = openGenericInterface.GetGenericArguments().Length == 1 && intImplementation != null
208-
? intImplementation
209-
: implementation;
210-
211206
_services.TryAddScoped(openGenericInterface, implementationType);
212207
}
213208
}

src/JsonApiDotNetCore/Configuration/ServiceCollectionExtensions.cs

+5-18
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4-
using System.Reflection;
54
using JetBrains.Annotations;
65
using JsonApiDotNetCore.Errors;
76
using JsonApiDotNetCore.Repositories;
@@ -56,8 +55,8 @@ private static void SetupApplicationBuilder(IServiceCollection services, Action<
5655
}
5756

5857
/// <summary>
59-
/// Adds IoC container registrations for the various JsonApiDotNetCore resource service interfaces, such as <see cref="IGetAllService{TResource}" />,
60-
/// <see cref="ICreateService{TResource}" /> and the various others.
58+
/// Adds IoC container registrations for the various JsonApiDotNetCore resource service interfaces, such as <see cref="IGetAllService{TResource,TId}" />,
59+
/// <see cref="ICreateService{TResource, TId}" /> and the various others.
6160
/// </summary>
6261
public static IServiceCollection AddResourceService<TService>(this IServiceCollection services)
6362
{
@@ -70,7 +69,7 @@ public static IServiceCollection AddResourceService<TService>(this IServiceColle
7069

7170
/// <summary>
7271
/// Adds IoC container registrations for the various JsonApiDotNetCore resource repository interfaces, such as
73-
/// <see cref="IResourceReadRepository{TResource}" /> and <see cref="IResourceWriteRepository{TResource}" />.
72+
/// <see cref="IResourceReadRepository{TResource,TId}" /> and <see cref="IResourceWriteRepository{TResource, TId}" />.
7473
/// </summary>
7574
public static IServiceCollection AddResourceRepository<TRepository>(this IServiceCollection services)
7675
{
@@ -83,7 +82,7 @@ public static IServiceCollection AddResourceRepository<TRepository>(this IServic
8382

8483
/// <summary>
8584
/// Adds IoC container registrations for the various JsonApiDotNetCore resource definition interfaces, such as
86-
/// <see cref="IResourceDefinition{TResource}" /> and <see cref="IResourceDefinition{TResource,TId}" />.
85+
/// <see cref="IResourceDefinition{TResource,TId}" />.
8786
/// </summary>
8887
public static IServiceCollection AddResourceDefinition<TResourceDefinition>(this IServiceCollection services)
8988
{
@@ -103,19 +102,7 @@ private static void RegisterForConstructedType(IServiceCollection services, Type
103102
{
104103
foreach (Type openGenericInterface in openGenericInterfaces)
105104
{
106-
// A shorthand interface is one where the ID type is omitted.
107-
// e.g. IResourceService<TResource> is the shorthand for IResourceService<TResource, TId>
108-
bool isShorthandInterface = openGenericInterface.GetTypeInfo().GenericTypeParameters.Length == 1;
109-
110-
if (isShorthandInterface && resourceDescriptor.IdClrType != typeof(int))
111-
{
112-
// We can't create a shorthand for ID types other than int.
113-
continue;
114-
}
115-
116-
Type constructedType = isShorthandInterface
117-
? openGenericInterface.MakeGenericType(resourceDescriptor.ResourceClrType)
118-
: openGenericInterface.MakeGenericType(resourceDescriptor.ResourceClrType, resourceDescriptor.IdClrType);
105+
Type constructedType = openGenericInterface.MakeGenericType(resourceDescriptor.ResourceClrType, resourceDescriptor.IdClrType);
119106

120107
if (constructedType.IsAssignableFrom(implementationType))
121108
{

src/JsonApiDotNetCore/Configuration/ServiceDiscoveryFacade.cs

-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ public sealed class ServiceDiscoveryFacade
4343

4444
internal static readonly HashSet<Type> ResourceDefinitionInterfaces = new()
4545
{
46-
typeof(IResourceDefinition<>),
4746
typeof(IResourceDefinition<,>)
4847
};
4948

src/JsonApiDotNetCore/Repositories/IRepositorySupportsTransaction.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace JsonApiDotNetCore.Repositories
44
{
55
/// <summary>
6-
/// Used to indicate that an <see cref="IResourceRepository{TResource}" /> supports execution inside a transaction.
6+
/// Used to indicate that an <see cref="IResourceRepository{TResource, TId}" /> supports execution inside a transaction.
77
/// </summary>
88
[PublicAPI]
99
public interface IRepositorySupportsTransaction

src/JsonApiDotNetCore/Resources/IResourceDefinition.cs

-12
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,6 @@
1010

1111
namespace JsonApiDotNetCore.Resources
1212
{
13-
/// <summary>
14-
/// Provides an extensibility point to add business logic that is resource-oriented instead of endpoint-oriented.
15-
/// </summary>
16-
/// <typeparam name="TResource">
17-
/// The resource type.
18-
/// </typeparam>
19-
[PublicAPI]
20-
public interface IResourceDefinition<TResource> : IResourceDefinition<TResource, int>
21-
where TResource : class, IIdentifiable<int>
22-
{
23-
}
24-
2513
/// <summary>
2614
/// Provides an extensibility point to add business logic that is resource-oriented instead of endpoint-oriented.
2715
/// </summary>

src/JsonApiDotNetCore/Resources/JsonApiResourceDefinition.cs

-17
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,6 @@
1414

1515
namespace JsonApiDotNetCore.Resources
1616
{
17-
/// <summary>
18-
/// Provides a resource-centric extensibility point for executing custom code when something happens with a resource. The goal here is to reduce the need
19-
/// for overriding the service and repository layers.
20-
/// </summary>
21-
/// <typeparam name="TResource">
22-
/// The resource type.
23-
/// </typeparam>
24-
[PublicAPI]
25-
public class JsonApiResourceDefinition<TResource> : JsonApiResourceDefinition<TResource, int>, IResourceDefinition<TResource>
26-
where TResource : class, IIdentifiable<int>
27-
{
28-
public JsonApiResourceDefinition(IResourceGraph resourceGraph)
29-
: base(resourceGraph)
30-
{
31-
}
32-
}
33-
3417
/// <inheritdoc />
3518
[PublicAPI]
3619
public class JsonApiResourceDefinition<TResource, TId> : IResourceDefinition<TResource, TId>

src/JsonApiDotNetCore/Resources/ResourceDefinitionAccessor.cs

-11
Original file line numberDiff line numberDiff line change
@@ -200,17 +200,6 @@ protected object ResolveResourceDefinition(Type resourceClrType)
200200

201201
protected virtual object ResolveResourceDefinition(ResourceType resourceType)
202202
{
203-
if (resourceType.IdentityClrType == typeof(int))
204-
{
205-
Type intResourceDefinitionType = typeof(IResourceDefinition<>).MakeGenericType(resourceType.ClrType);
206-
object intResourceDefinition = _serviceProvider.GetService(intResourceDefinitionType);
207-
208-
if (intResourceDefinition != null)
209-
{
210-
return intResourceDefinition;
211-
}
212-
}
213-
214203
Type resourceDefinitionType = typeof(IResourceDefinition<,>).MakeGenericType(resourceType.ClrType, resourceType.IdentityClrType);
215204
return _serviceProvider.GetRequiredService(resourceDefinitionType);
216205
}

test/DiscoveryTests/ServiceDiscoveryFacadeTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ public void Can_add_resource_definition_from_current_assembly_to_container()
127127
// Assert
128128
ServiceProvider services = _services.BuildServiceProvider();
129129

130-
var resourceDefinition = services.GetRequiredService<IResourceDefinition<TestResource>>();
130+
var resourceDefinition = services.GetRequiredService<IResourceDefinition<TestResource, int>>();
131131
resourceDefinition.Should().BeOfType<TestResourceDefinition>();
132132
}
133133
}

test/DiscoveryTests/TestResourceDefinition.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace DiscoveryTests
66
{
77
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
8-
public sealed class TestResourceDefinition : JsonApiResourceDefinition<TestResource>
8+
public sealed class TestResourceDefinition : JsonApiResourceDefinition<TestResource, int>
99
{
1010
public TestResourceDefinition(IResourceGraph resourceGraph)
1111
: base(resourceGraph)

test/JsonApiDotNetCoreTests/IntegrationTests/Archiving/TelevisionBroadcastDefinition.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
namespace JsonApiDotNetCoreTests.IntegrationTests.Archiving
1919
{
2020
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
21-
public sealed class TelevisionBroadcastDefinition : JsonApiResourceDefinition<TelevisionBroadcast>
21+
public sealed class TelevisionBroadcastDefinition : JsonApiResourceDefinition<TelevisionBroadcast, int>
2222
{
2323
private readonly TelevisionDbContext _dbContext;
2424
private readonly IJsonApiRequest _request;

test/JsonApiDotNetCoreTests/IntegrationTests/Meta/SupportTicketDefinition.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
namespace JsonApiDotNetCoreTests.IntegrationTests.Meta
88
{
99
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
10-
public sealed class SupportTicketDefinition : JsonApiResourceDefinition<SupportTicket>
10+
public sealed class SupportTicketDefinition : JsonApiResourceDefinition<SupportTicket, int>
1111
{
1212
private readonly ResourceDefinitionHitCounter _hitCounter;
1313

test/JsonApiDotNetCoreTests/IntegrationTests/ReadWrite/ImplicitlyChangingWorkItemDefinition.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace JsonApiDotNetCoreTests.IntegrationTests.ReadWrite
1212
/// Used to simulate side effects that occur in the database while saving, typically caused by database triggers.
1313
/// </summary>
1414
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
15-
public sealed class ImplicitlyChangingWorkItemDefinition : JsonApiResourceDefinition<WorkItem>
15+
public sealed class ImplicitlyChangingWorkItemDefinition : JsonApiResourceDefinition<WorkItem, int>
1616
{
1717
internal const string Suffix = " (changed)";
1818

test/JsonApiDotNetCoreTests/IntegrationTests/ReadWrite/Updating/Relationships/RemoveFromToManyRelationshipTests.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ public RemoveFromToManyRelationshipTests(IntegrationTestContext<TestableStartup<
3232

3333
testContext.ConfigureServicesAfterStartup(services =>
3434
{
35-
services.AddSingleton<IResourceDefinition<WorkItem>, RemoveExtraFromWorkItemDefinition>();
35+
services.AddSingleton<IResourceDefinition<WorkItem, int>, RemoveExtraFromWorkItemDefinition>();
3636
});
3737

38-
var workItemDefinition = (RemoveExtraFromWorkItemDefinition)testContext.Factory.Services.GetRequiredService<IResourceDefinition<WorkItem>>();
38+
var workItemDefinition = (RemoveExtraFromWorkItemDefinition)testContext.Factory.Services.GetRequiredService<IResourceDefinition<WorkItem, int>>();
3939
workItemDefinition.Reset();
4040
}
4141

@@ -147,7 +147,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
147147
await dbContext.SaveChangesAsync();
148148
});
149149

150-
var workItemDefinition = (RemoveExtraFromWorkItemDefinition)_testContext.Factory.Services.GetRequiredService<IResourceDefinition<WorkItem>>();
150+
var workItemDefinition = (RemoveExtraFromWorkItemDefinition)_testContext.Factory.Services.GetRequiredService<IResourceDefinition<WorkItem, int>>();
151151
workItemDefinition.ExtraSubscribersIdsToRemove.Add(existingWorkItem.Subscribers.ElementAt(2).Id);
152152

153153
var requestBody = new
@@ -255,7 +255,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
255255
await dbContext.SaveChangesAsync();
256256
});
257257

258-
var workItemDefinition = (RemoveExtraFromWorkItemDefinition)_testContext.Factory.Services.GetRequiredService<IResourceDefinition<WorkItem>>();
258+
var workItemDefinition = (RemoveExtraFromWorkItemDefinition)_testContext.Factory.Services.GetRequiredService<IResourceDefinition<WorkItem, int>>();
259259
workItemDefinition.ExtraTagIdsToRemove.Add(existingWorkItem.Tags.ElementAt(2).Id);
260260

261261
var requestBody = new
@@ -1020,7 +1020,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext =>
10201020
}
10211021

10221022
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
1023-
private sealed class RemoveExtraFromWorkItemDefinition : JsonApiResourceDefinition<WorkItem>
1023+
private sealed class RemoveExtraFromWorkItemDefinition : JsonApiResourceDefinition<WorkItem, int>
10241024
{
10251025
// Enables to verify that not the full relationship was loaded upfront.
10261026
public ISet<UserAccount> PreloadedSubscribers { get; } = new HashSet<UserAccount>(IdentifiableComparer.Instance);

test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace JsonApiDotNetCoreTests.IntegrationTests.ResourceDefinitions.Reading
1111
{
1212
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
13-
public sealed class MoonDefinition : JsonApiResourceDefinition<Moon>
13+
public sealed class MoonDefinition : JsonApiResourceDefinition<Moon, int>
1414
{
1515
private readonly IClientSettingsProvider _clientSettingsProvider;
1616
private readonly ResourceDefinitionHitCounter _hitCounter;

test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/PlanetDefinition.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
namespace JsonApiDotNetCoreTests.IntegrationTests.ResourceDefinitions.Reading
1313
{
1414
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
15-
public sealed class PlanetDefinition : JsonApiResourceDefinition<Planet>
15+
public sealed class PlanetDefinition : JsonApiResourceDefinition<Planet, int>
1616
{
1717
private readonly IClientSettingsProvider _clientSettingsProvider;
1818
private readonly ResourceDefinitionHitCounter _hitCounter;

test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/StarDefinition.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
namespace JsonApiDotNetCoreTests.IntegrationTests.ResourceDefinitions.Reading
88
{
99
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
10-
public sealed class StarDefinition : JsonApiResourceDefinition<Star>
10+
public sealed class StarDefinition : JsonApiResourceDefinition<Star, int>
1111
{
1212
private readonly ResourceDefinitionHitCounter _hitCounter;
1313

test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/StudentDefinition.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace JsonApiDotNetCoreTests.IntegrationTests.ResourceDefinitions.Serialization
66
{
77
[UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)]
8-
public sealed class StudentDefinition : JsonApiResourceDefinition<Student>
8+
public sealed class StudentDefinition : JsonApiResourceDefinition<Student, int>
99
{
1010
private readonly IEncryptionService _encryptionService;
1111
private readonly ResourceDefinitionHitCounter _hitCounter;

test/JsonApiDotNetCoreTests/UnitTests/Serialization/InputConversionTests.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.ComponentModel.Design;
44
using FluentAssertions;
@@ -248,7 +248,7 @@ private static DocumentAdapter CreateDocumentAdapter<TResource>(Func<IResourceGr
248248
var resourceDefinitionAccessor = new ResourceDefinitionAccessor(resourceGraph, serviceContainer);
249249

250250
serviceContainer.AddService(typeof(IResourceDefinitionAccessor), resourceDefinitionAccessor);
251-
serviceContainer.AddService(typeof(IResourceDefinition<TResource>), new JsonApiResourceDefinition<TResource>(resourceGraph));
251+
serviceContainer.AddService(typeof(IResourceDefinition<TResource, int>), new JsonApiResourceDefinition<TResource, int>(resourceGraph));
252252

253253
JsonApiRequest request = createRequest(resourceGraph);
254254
var targetedFields = new TargetedFields();

0 commit comments

Comments
 (0)