void InitializeInfo(Service service, ServiceRegistrationInfo info) { if (!info.IsInitializing) { info.BeginInitialization(_dynamicRegistrationSources); } while (info.HasSourcesToQuery) { var next = info.DequeueNextSource(); foreach (var provided in next.RegistrationsFor(service, RegistrationsFor)) { // This ensures that multiple services provided by the same // component share a single component (we don't re-query for them) foreach (var additionalService in provided.Services) { var additionalInfo = GetServiceInfo(additionalService); if (additionalInfo.IsInitialized) { continue; } if (!additionalInfo.IsInitializing) { additionalInfo.BeginInitialization(_dynamicRegistrationSources.Where(src => src != next)); } else { additionalInfo.SkipSource(next); } } AddRegistration(provided, true); } } info.CompleteInitialization(); }
ServiceRegistrationInfo GetServiceInfo(Service service) { ServiceRegistrationInfo existing; if (_serviceInfo.TryGetValue(service, out existing)) return existing; var info = new ServiceRegistrationInfo(service); _serviceInfo.Add(service, info); return info; }
void InitializeInfo(Service service, ServiceRegistrationInfo info) { if (!info.IsInitializing) info.BeginInitialization(_dynamicRegistrationSources); while (info.HasSourcesToQuery) { var next = info.DequeueNextSource(); foreach (var provided in next.RegistrationsFor(service, RegistrationsFor)) { // This ensures that multiple services provided by the same // component share a single component (we don't re-query for them) foreach (var additionalService in provided.Services) { var additionalInfo = GetServiceInfo(additionalService); if (additionalInfo.IsInitialized) continue; if (!additionalInfo.IsInitializing) additionalInfo.BeginInitialization(_dynamicRegistrationSources.Where(src => src != next)); else additionalInfo.SkipSource(next); } AddRegistration(provided, true); } } info.CompleteInitialization(); }