public ComponentDebuggerView(MetaComponent component, params IComponentDebuggerExtension[] defaultExtension)
		{
			key = component.Name;
			additionalServicesCount = component.ServicesCount - 1;
			handler = component.Handler;
			extension = defaultExtension.Concat(GetExtensions(handler)).ToArray();
			description = BuildDescription();
		}
		public ComponentDebuggerView(MetaComponent component,
		                             params IComponentDebuggerExtension[] defaultExtension)
		{
			key = component.Name;
			forwardedCount = component.ForwardedTypesCount;
			handler = component.Handler;
			extension = defaultExtension.Concat(GetExtensions(handler)).ToArray();
		}
		private IEnumerable<DebuggerViewItem> GetMismatches(MetaComponent component, ComponentsMap component2Handlers)
		{
			var handler = component.Handler;
			if (IsSingleton(handler) == false)
			{
				yield break;
			}
			var root = new LifestyleDependency(component);
			foreach (ComponentModel dependent in handler.ComponentModel.Dependents)
			{
				foreach (var mismatch in GetMismatch(root, dependent, component2Handlers))
				{
					yield return mismatch.ViewItem;
				}
			}
		}
		private void ContributeItem(MetaComponent mismatched, StringBuilder message, IList<MetaComponent> items)
		{
			if (ImTheRoot())
			{
				items.Add(component);
				message.AppendFormat("Component '{0}' with lifestyle {1} ", component.Name,
				                     component.Model.GetLifestyleDescription());

				message.AppendFormat("depends on '{0}' with lifestyle {1}", mismatched.Name,
				                     mismatched.Model.GetLifestyleDescription());
				return;
			}
			parent.ContributeItem(mismatched, message, items);
			items.Add(component);
			message.AppendLine();
			message.AppendFormat("\tvia '{0}' with lifestyle {1}", component.Name,
								 component.Model.GetLifestyleDescription());
		}
		public LifestyleDependency(MetaComponent component, LifestyleDependency parent = null)
		{
			this.component = component;
			this.parent = parent;
		}
		private string GetName(MetaComponent root)
		{
			var indirect = (parent.component == root) ? string.Empty : "indirectly ";
			return string.Format("\"{0}\" »{1}« {2}depends on", root.Name, root.Model.GetLifestyleDescription(), indirect);
		}
		protected ComponentDebuggerView DefaultComponentView(MetaComponent component)
		{
			return new ComponentDebuggerView(component,
			                                 new DefaultComponentView(component.Handler, component.ForwardedTypes));
		}
		protected ComponentDebuggerView DefaultComponentView(MetaComponent component)
		{
			return new ComponentDebuggerView(component, new DefaultComponentView(component.Handler));
		}
		private DebuggerViewItem BuildComponentView(MetaComponent component)
		{
			var defaultExtension = new DefaultComponentView(component.Handler, component.ForwardedTypes);
			var item = new ComponentDebuggerView(component, defaultExtension);
			return new DebuggerViewItem(component.Name, component.Model.GetLifestyleDescription(), item);
		}
		public MismatchedDependency(string description, MetaComponent[] components)
		{
			this.components = components;
			this.description = description;
		}