1
1
namespace System . Web . Http
2
2
{
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 ;
10
3
using Microsoft . AspNet . OData . Routing . Conventions ;
11
4
using Microsoft . Extensions . DependencyInjection ;
12
5
using Microsoft . OData ;
13
- using static Microsoft . OData . ServiceLifetime ;
6
+ using System . Reflection ;
7
+ using static System . Linq . Expressions . Expression ;
14
8
15
9
static class IContainerBuilderExtensions
16
10
{
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 ) ;
47
12
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 > ( ) ;
64
14
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 ) ;
80
16
81
- static void AddBinders ( IContainerBuilder builder )
17
+ static Action < IContainerBuilder > NewAddDefaultWebApiServicesFunc ( )
82
18
{
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 ) ;
86
24
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 ( ) ;
91
26
}
92
27
}
93
28
}
0 commit comments