Skip to content

Commit bb1d65a

Browse files
author
Chris Martinez
committed
Revert to using Reflection to invoke default container configuration. Fixes #525
1 parent 7f965a7 commit bb1d65a

File tree

1 file changed

+12
-77
lines changed

1 file changed

+12
-77
lines changed
Lines changed: 12 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,28 @@
11
namespace System.Web.Http
22
{
3-
using Microsoft.AspNet.OData;
4-
using Microsoft.AspNet.OData.Formatter.Deserialization;
5-
using Microsoft.AspNet.OData.Formatter.Serialization;
6-
using Microsoft.AspNet.OData.Query;
7-
using Microsoft.AspNet.OData.Query.Expressions;
8-
using Microsoft.AspNet.OData.Query.Validators;
9-
using Microsoft.AspNet.OData.Routing;
103
using Microsoft.AspNet.OData.Routing.Conventions;
114
using Microsoft.Extensions.DependencyInjection;
125
using Microsoft.OData;
13-
using static Microsoft.OData.ServiceLifetime;
6+
using System.Reflection;
7+
using static System.Linq.Expressions.Expression;
148

159
static class IContainerBuilderExtensions
1610
{
17-
internal static void InitializeAttributeRouting( this IServiceProvider serviceProvider ) => serviceProvider.GetServices<IODataRoutingConvention>();
18-
19-
internal static void AddDefaultWebApiServices( this IContainerBuilder builder )
20-
{
21-
builder.AddService<IODataPathHandler, DefaultODataPathHandler>( Singleton );
22-
AddServicePrototypes( builder );
23-
AddQueryValidators( builder );
24-
AddSerializationProviders( builder );
25-
AddDeserializerServices( builder );
26-
AddSerializerServices( builder );
27-
AddBinders( builder );
28-
AddHttpRequestScope( builder );
29-
}
30-
31-
static void AddServicePrototypes( IContainerBuilder builder )
32-
{
33-
builder.AddServicePrototype( new ODataMessageReaderSettings() { EnableMessageStreamDisposal = false, MessageQuotas = new ODataMessageQuotas { MaxReceivedMessageSize = long.MaxValue } } );
34-
builder.AddServicePrototype( new ODataMessageWriterSettings() { EnableMessageStreamDisposal = false, MessageQuotas = new ODataMessageQuotas { MaxReceivedMessageSize = long.MaxValue } } );
35-
}
36-
37-
static void AddQueryValidators( IContainerBuilder builder )
38-
{
39-
builder.AddService<CountQueryValidator>( Singleton );
40-
builder.AddService<FilterQueryValidator>( Scoped );
41-
builder.AddService<ODataQueryValidator>( Singleton );
42-
builder.AddService<OrderByQueryValidator>( Singleton );
43-
builder.AddService<SelectExpandQueryValidator>( Singleton );
44-
builder.AddService<SkipQueryValidator>( Singleton );
45-
builder.AddService<TopQueryValidator>( Singleton );
46-
}
11+
private static readonly Lazy<Action<IContainerBuilder>> addDefaultWebApiServices = new Lazy<Action<IContainerBuilder>>( NewAddDefaultWebApiServicesFunc );
4712

48-
static void AddSerializationProviders( IContainerBuilder builder )
49-
{
50-
builder.AddService<ODataSerializerProvider, DefaultODataSerializerProvider>( Singleton );
51-
builder.AddService<ODataDeserializerProvider, DefaultODataDeserializerProvider>( Singleton );
52-
}
53-
54-
static void AddDeserializerServices( IContainerBuilder builder )
55-
{
56-
builder.AddService<ODataResourceDeserializer>( Singleton );
57-
builder.AddService<ODataEnumDeserializer>( Singleton );
58-
builder.AddService<ODataPrimitiveDeserializer>( Singleton );
59-
builder.AddService<ODataResourceSetDeserializer>( Singleton );
60-
builder.AddService<ODataCollectionDeserializer>( Singleton );
61-
builder.AddService<ODataEntityReferenceLinkDeserializer>( Singleton );
62-
builder.AddService<ODataActionPayloadDeserializer>( Singleton );
63-
}
13+
internal static void InitializeAttributeRouting( this IServiceProvider serviceProvider ) => serviceProvider.GetServices<IODataRoutingConvention>();
6414

65-
static void AddSerializerServices( IContainerBuilder builder )
66-
{
67-
builder.AddService<ODataEnumSerializer>( Singleton );
68-
builder.AddService<ODataPrimitiveSerializer>( Singleton );
69-
builder.AddService<ODataDeltaFeedSerializer>( Singleton );
70-
builder.AddService<ODataResourceSetSerializer>( Singleton );
71-
builder.AddService<ODataCollectionSerializer>( Singleton );
72-
builder.AddService<ODataResourceSerializer>( Singleton );
73-
builder.AddService<ODataServiceDocumentSerializer>( Singleton );
74-
builder.AddService<ODataEntityReferenceLinkSerializer>( Singleton );
75-
builder.AddService<ODataEntityReferenceLinksSerializer>( Singleton );
76-
builder.AddService<ODataErrorSerializer>( Singleton );
77-
builder.AddService<ODataMetadataSerializer>( Singleton );
78-
builder.AddService<ODataRawValueSerializer>( Singleton );
79-
}
15+
internal static void AddDefaultWebApiServices( this IContainerBuilder builder ) => addDefaultWebApiServices.Value( builder );
8016

81-
static void AddBinders( IContainerBuilder builder )
17+
static Action<IContainerBuilder> NewAddDefaultWebApiServicesFunc()
8218
{
83-
builder.AddService<ODataQuerySettings>( Scoped );
84-
builder.AddService<FilterBinder>( Transient );
85-
}
19+
var type = Type.GetType( "Microsoft.AspNet.OData.Extensions.ContainerBuilderExtensions, Microsoft.AspNet.OData", throwOnError: true );
20+
var method = type.GetRuntimeMethod( nameof( AddDefaultWebApiServices ), new[] { typeof( IContainerBuilder ) } );
21+
var builder = Parameter( typeof( IContainerBuilder ), "builder" );
22+
var body = Call( null, method, builder );
23+
var lambda = Lambda<Action<IContainerBuilder>>( body, builder );
8624

87-
static void AddHttpRequestScope( IContainerBuilder builder )
88-
{
89-
builder.AddService<HttpRequestScope>( Scoped );
90-
builder.AddService( Scoped, sp => sp.GetRequiredService<HttpRequestScope>().HttpRequest );
25+
return lambda.Compile();
9126
}
9227
}
9328
}

0 commit comments

Comments
 (0)