1
+ // Copyright (c) .NET Foundation. All rights reserved.
2
+ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3
+
4
+ using System ;
5
+
6
+ namespace Microsoft . Extensions . DependencyInjection . ServiceLookup
7
+ {
8
+ internal class CallSiteValidator : CallSiteVisitor < CallSiteValidatorState , object >
9
+ {
10
+ public void Validate ( IServiceCallSite callSite )
11
+ {
12
+ VisitCallSite ( callSite , default ( CallSiteValidatorState ) ) ;
13
+ }
14
+
15
+ protected override object VisitTransient ( TransientCallSite transientCallSite , CallSiteValidatorState state )
16
+ {
17
+ VisitCallSite ( transientCallSite . Service , state ) ;
18
+ return null ;
19
+ }
20
+
21
+ protected override object VisitConstructor ( ConstructorCallSite constructorCallSite , CallSiteValidatorState state )
22
+ {
23
+ foreach ( var parameterCallSite in constructorCallSite . ParameterCallSites )
24
+ {
25
+ VisitCallSite ( parameterCallSite , state ) ;
26
+ }
27
+ return null ;
28
+ }
29
+
30
+ protected override object VisitSingleton ( SingletonCallSite singletonCallSite , CallSiteValidatorState state )
31
+ {
32
+ state . Singleton = singletonCallSite ;
33
+ VisitCallSite ( singletonCallSite . ServiceCallSite , state ) ;
34
+ return null ;
35
+ }
36
+
37
+ protected override object VisitScoped ( ScopedCallSite scopedCallSite , CallSiteValidatorState state )
38
+ {
39
+ // We are fine with having ServiceScopeService requested by singletons
40
+ if ( scopedCallSite . ServiceCallSite is ServiceScopeService )
41
+ {
42
+ return null ;
43
+ }
44
+ if ( state . Singleton != null )
45
+ {
46
+ throw new InvalidOperationException ( Resources . FormatScopedInSingletonException ( scopedCallSite . Key . Type , state . Singleton . Key . Type ) ) ;
47
+ }
48
+ VisitCallSite ( scopedCallSite . ServiceCallSite , state ) ;
49
+ return null ;
50
+ }
51
+
52
+ protected override object VisitConstant ( ConstantCallSite constantCallSite , CallSiteValidatorState state ) => null ;
53
+
54
+ protected override object VisitCreateInstance ( CreateInstanceCallSite createInstanceCallSite , CallSiteValidatorState state ) => null ;
55
+
56
+ protected override object VisitInstanceService ( InstanceService instanceCallSite , CallSiteValidatorState state ) => null ;
57
+
58
+ protected override object VisitServiceProviderService ( ServiceProviderService serviceProviderService , CallSiteValidatorState state ) => null ;
59
+
60
+ protected override object VisitEmptyIEnumerable ( EmptyIEnumerableCallSite emptyIEnumerableCallSite , CallSiteValidatorState state ) => null ;
61
+
62
+ protected override object VisitServiceScopeService ( ServiceScopeService serviceScopeService , CallSiteValidatorState state ) => null ;
63
+
64
+ protected override object VisitClosedIEnumerable ( ClosedIEnumerableCallSite closedIEnumerableCallSite , CallSiteValidatorState state ) => null ;
65
+
66
+ protected override object VisitFactoryService ( FactoryService factoryService , CallSiteValidatorState state ) => null ;
67
+ }
68
+ }
0 commit comments