private IEnumerable<LifestyleDependency> GetMismatch(LifestyleDependency parent, ComponentModel component,
		                                                     ComponentsMap model2Meta)
		{
			if (parent.Handler.ComponentModel == component)
			{
				yield break;
			}

			var pair = model2Meta[component];
			var handler = pair.Handler;
			var item = new LifestyleDependency(pair, parent);
			if (item.Mismatched())
			{
				yield return item;
			}
			else
			{
				foreach (ComponentModel dependent in handler.ComponentModel.Dependents)
				{
					foreach (var mismatch in GetMismatch(item, dependent, model2Meta))
					{
						yield return mismatch;
					}
				}
			}
		}
		private IEnumerable<LifestyleDependency> GetMismatch(LifestyleDependency parent, ComponentModel component,
		                                                     Dictionary<ComponentModel, IHandler> model2Handler)
		{
			if (parent.Handler.ComponentModel == component)
			{
				yield break;
			}

			var handler = model2Handler[component];
			var item = new LifestyleDependency(handler, parent);
			if (item.Mismatched())
			{
				yield return item;
			}
			else
			{
				foreach (ComponentModel dependent in handler.ComponentModel.Dependents)
				{
					foreach (var mismatch in GetMismatch(item, dependent, model2Handler))
					{
						yield return mismatch;
					}
				}
			}
		}
		private IEnumerable<DebuggerViewItem> GetMismatches(Dictionary<ComponentModel, IHandler> model2Handler, IHandler handler)
		{
			if (IsSingleton(handler) == false)
			{
				yield break;
			}
			var root = new LifestyleDependency(handler);
			foreach (ComponentModel dependent in handler.ComponentModel.Dependents)
			{
				foreach (var mismatch in GetMismatch(root, dependent, model2Handler))
				{
					yield return mismatch.ViewItem;
				}
			}
		}
		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;
				}
			}
		}
		public LifestyleDependency(MetaComponent component, LifestyleDependency parent = null)
		{
			this.component = component;
			this.parent = parent;
		}
		public LifestyleDependency(IHandler handler, LifestyleDependency parent = null)
		{
			this.handler = handler;
			this.parent = parent;
		}