11namespace 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