Skip to content

Commit 6ca6010

Browse files
author
Chris Santero
committed
add way to configure a default related resource materializer per resource type
1 parent c2eaa23 commit 6ca6010

4 files changed

Lines changed: 28 additions & 1 deletion

File tree

JSONAPI.Autofac/JsonApiAutofacModule.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,19 @@ protected override void Load(ContainerBuilder builder)
9393
new TypedParameter(typeof(ResourceTypeRelationship), relationship)
9494
};
9595

96+
// First, see if they have set an explicit materializer for this relationship
9697
IResourceTypeRelationshipConfiguration relationshipConfiguration;
9798
if (configuration.RelationshipConfigurations.TryGetValue(relationship.Property,
9899
out relationshipConfiguration) && relationshipConfiguration.MaterializerType != null)
99100
return (IRelatedResourceDocumentMaterializer)context.Resolve(relationshipConfiguration.MaterializerType, parameters);
101+
102+
// They didn't set an explicit materializer. See if they specified a factory for this resource type.
103+
if (configuration.RelatedResourceMaterializerTypeFactory != null)
104+
{
105+
var materializerType = configuration.RelatedResourceMaterializerTypeFactory(relationship);
106+
return (IRelatedResourceDocumentMaterializer)context.Resolve(materializerType, parameters);
107+
}
108+
100109
return context.Resolve<IRelatedResourceDocumentMaterializer>(parameters);
101110
};
102111
return factory;

JSONAPI/Configuration/IResourceTypeConfiguration.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ public interface IResourceTypeConfiguration
2626
/// </summary>
2727
Type DocumentMaterializerType { get; }
2828

29+
/// <summary>
30+
/// A factory to determine the related resource materializer for a given relationship
31+
/// </summary>
32+
Func<ResourceTypeRelationship, Type> RelatedResourceMaterializerTypeFactory { get; }
33+
2934
/// <summary>
3035
/// Configurations for this type's resources
3136
/// </summary>

JSONAPI/Configuration/IResourceTypeConfigurator.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Linq.Expressions;
3+
using JSONAPI.Core;
34
using JSONAPI.Http;
45

56
namespace JSONAPI.Configuration
@@ -20,5 +21,11 @@ void ConfigureRelationship(Expression<Func<TResourceType, object>> property,
2021
/// </summary>
2122
/// <typeparam name="TMaterializer"></typeparam>
2223
void UseDocumentMaterializer<TMaterializer>() where TMaterializer : IDocumentMaterializer;
24+
25+
/// <summary>
26+
/// Allows specifying a default materializer for related resources.
27+
/// </summary>
28+
/// <param name="materializerTypeFactory"></param>
29+
void UseDefaultRelatedResourceMaterializer(Func<ResourceTypeRelationship, Type> materializerTypeFactory);
2330
}
2431
}

JSONAPI/Configuration/ResourceTypeConfiguration.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace JSONAPI.Configuration
1212
/// Configuration mechanism for resource types.
1313
/// </summary>
1414
/// <typeparam name="TResourceType"></typeparam>
15-
public sealed class ResourceTypeConfiguration<TResourceType> : IResourceTypeConfiguration, IResourceTypeConfigurator<TResourceType>
15+
public sealed class ResourceTypeConfiguration<TResourceType> : IResourceTypeConfigurator<TResourceType>, IResourceTypeConfiguration
1616
{
1717
private readonly IResourceTypeRegistrar _resourceTypeRegistrar;
1818

@@ -26,6 +26,7 @@ internal ResourceTypeConfiguration(IResourceTypeRegistrar resourceTypeRegistrar)
2626
public string ResourceTypeName { get; private set; }
2727
public Type ClrType { get; private set; }
2828
public Type DocumentMaterializerType { get; private set; }
29+
public Func<ResourceTypeRelationship, Type> RelatedResourceMaterializerTypeFactory { get; private set; }
2930
public IDictionary<PropertyInfo, IResourceTypeRelationshipConfiguration> RelationshipConfigurations { get; private set; }
3031
public Func<ParameterExpression, string, BinaryExpression> FilterByIdExpressionFactory { get; private set; }
3132
public Func<ParameterExpression, Expression> SortByIdExpressionFactory { get; private set; }
@@ -51,6 +52,11 @@ public void UseDocumentMaterializer<TMaterializer>()
5152
DocumentMaterializerType = typeof (TMaterializer);
5253
}
5354

55+
public void UseDefaultRelatedResourceMaterializer(Func<ResourceTypeRelationship, Type> materializerTypeFactory)
56+
{
57+
RelatedResourceMaterializerTypeFactory = materializerTypeFactory;
58+
}
59+
5460
/// <summary>
5561
/// Overrides the resource type name from naming conventions
5662
/// </summary>

0 commit comments

Comments
 (0)