Tracks the services known to the registry.
        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();
        }
Example #2
0
		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;
		}
Example #3
0
		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();
		}