@@ -37,7 +37,7 @@ public class ServiceDiscoveryFacade : IServiceDiscoveryFacade
37
37
typeof ( IDeleteService < , > )
38
38
} ;
39
39
40
- private static readonly HashSet < Type > RepositoryInterfaces = new HashSet < Type > {
40
+ private static readonly HashSet < Type > _repositoryInterfaces = new HashSet < Type > {
41
41
typeof ( IResourceRepository < > ) ,
42
42
typeof ( IResourceRepository < , > ) ,
43
43
typeof ( IResourceWriteRepository < > ) ,
@@ -50,44 +50,48 @@ public class ServiceDiscoveryFacade : IServiceDiscoveryFacade
50
50
private readonly IResourceGraphBuilder _resourceGraphBuilder ;
51
51
private readonly IdentifiableTypeCache _typeCache = new IdentifiableTypeCache ( ) ;
52
52
private readonly Dictionary < Assembly , IEnumerable < ResourceDescriptor > > _discoverableAssemblies = new Dictionary < Assembly , IEnumerable < ResourceDescriptor > > ( ) ;
53
+
53
54
public ServiceDiscoveryFacade ( IServiceCollection services , IResourceGraphBuilder resourceGraphBuilder )
54
55
{
55
56
_services = services ;
56
57
_resourceGraphBuilder = resourceGraphBuilder ;
57
58
}
58
59
59
- /// <summary>
60
- /// Adds resource, service and repository implementations to the container.
61
- /// </summary>
60
+ /// <inheritdoc/>
62
61
public ServiceDiscoveryFacade AddCurrentAssembly ( ) => AddAssembly ( Assembly . GetCallingAssembly ( ) ) ;
63
62
64
- /// <summary>
65
- /// Adds resource, service and repository implementations defined in the specified assembly to the container.
66
- /// </summary>
63
+ /// <inheritdoc/>
67
64
public ServiceDiscoveryFacade AddAssembly ( Assembly assembly )
68
65
{
69
- _discoverableAssemblies . Add ( assembly , _typeCache . GetIdentifiableTypes ( assembly ) ) ;
66
+ _discoverableAssemblies . Add ( assembly , null ) ;
70
67
71
68
return this ;
72
69
}
73
70
74
- public void DiscoverResources ( )
71
+ /// <inheritdoc/>
72
+ void IServiceDiscoveryFacade . DiscoverResources ( )
75
73
{
76
- foreach ( var ( assembly , resourceDescriptors ) in _discoverableAssemblies )
74
+
75
+ foreach ( var ( assembly , discoveredResourceDescriptors ) in _discoverableAssemblies )
77
76
{
77
+ var resourceDescriptors = GetOrSetResourceDescriptors ( discoveredResourceDescriptors , assembly ) ;
78
+
78
79
foreach ( var descriptor in resourceDescriptors )
79
80
{
80
81
AddResource ( assembly , descriptor ) ;
81
82
}
82
83
}
83
84
}
84
-
85
- public void DiscoverServices ( )
85
+
86
+ /// <inheritdoc/>
87
+ void IServiceDiscoveryFacade . DiscoverServices ( )
86
88
{
87
- foreach ( var ( assembly , resourceDescriptors ) in _discoverableAssemblies )
89
+ foreach ( var ( assembly , discoveredResourceDescriptors ) in _discoverableAssemblies )
88
90
{
89
91
AddDbContextResolvers ( assembly ) ;
90
92
93
+ var resourceDescriptors = GetOrSetResourceDescriptors ( discoveredResourceDescriptors , assembly ) ;
94
+
91
95
foreach ( var descriptor in resourceDescriptors )
92
96
{
93
97
AddResourceDefinition ( assembly , descriptor ) ;
@@ -106,8 +110,6 @@ private void AddDbContextResolvers(Assembly assembly)
106
110
_services . AddScoped ( typeof ( IDbContextResolver ) , resolverType ) ;
107
111
}
108
112
}
109
-
110
-
111
113
112
114
private void AddResource ( Assembly assembly , ResourceDescriptor resourceDescriptor )
113
115
{
@@ -140,7 +142,7 @@ private void AddServices(Assembly assembly, ResourceDescriptor resourceDescripto
140
142
141
143
private void AddRepositories ( Assembly assembly , ResourceDescriptor resourceDescriptor )
142
144
{
143
- foreach ( var serviceInterface in RepositoryInterfaces )
145
+ foreach ( var serviceInterface in _repositoryInterfaces )
144
146
{
145
147
RegisterServiceImplementations ( assembly , serviceInterface , resourceDescriptor ) ;
146
148
}
@@ -153,12 +155,28 @@ private void RegisterServiceImplementations(Assembly assembly, Type interfaceTyp
153
155
return ;
154
156
}
155
157
var genericArguments = interfaceType . GetTypeInfo ( ) . GenericTypeParameters . Length == 2 ? new [ ] { resourceDescriptor . ResourceType , resourceDescriptor . IdType } : new [ ] { resourceDescriptor . ResourceType } ;
156
- var service = TypeLocator . GetGenericInterfaceImplementation ( assembly , interfaceType , genericArguments ) ;
158
+ var ( implementation , registrationInterface ) = TypeLocator . GetGenericInterfaceImplementation ( assembly , interfaceType , genericArguments ) ;
157
159
158
- if ( service . implementation != null )
160
+ if ( implementation != null )
159
161
{
160
- _services . AddScoped ( service . registrationInterface , service . implementation ) ;
162
+ _services . AddScoped ( registrationInterface , implementation ) ;
161
163
}
162
164
}
165
+
166
+ private IEnumerable < ResourceDescriptor > GetOrSetResourceDescriptors ( IEnumerable < ResourceDescriptor > discoveredResourceDescriptors , Assembly assembly )
167
+ {
168
+ IEnumerable < ResourceDescriptor > resourceDescriptors ;
169
+ if ( discoveredResourceDescriptors == null )
170
+ {
171
+ resourceDescriptors = _typeCache . GetIdentifiableTypes ( assembly ) ;
172
+ _discoverableAssemblies [ assembly ] = resourceDescriptors ;
173
+ }
174
+ else
175
+ {
176
+ resourceDescriptors = discoveredResourceDescriptors ;
177
+ }
178
+
179
+ return resourceDescriptors ;
180
+ }
163
181
}
164
182
}
0 commit comments