public void MultiThreaded_RemoveResolve_Throws_When_LargeRatio_Of_ComponentsToService()
		{
			var threadCount = 1000;
			var list = new List<Exception>();
			var locker = new object();
			var rand = new Random();
			var waitEvent = new ManualResetEvent(false);

			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey, new KeySearchNamingSubSystem(delegate { return false; }));

			kernel.Register(Component.For(typeof(ICommon)).ImplementedBy(typeof(CommonImpl1)).Named("common"));

			WaitCallback resolveThread = delegate
			{
				waitEvent.WaitOne();
				while (threadCount > 0 && list.Count == 0)
				{
					try
					{
						kernel.Resolve<ICommon>();
					}
					catch (Exception e)
					{
						lock (locker)
						{
							list.Add(e);
						}
					}
				}
			};
			ThreadPool.QueueUserWorkItem(resolveThread);

			WaitCallback removeThread = delegate
			{
				waitEvent.WaitOne();
				kernel.RemoveComponent(threadCount + ".common");
				Interlocked.Decrement(ref threadCount);
			};
			for (var i = 0; i < threadCount; i++)
			{
				kernel.Register(Component.For(typeof(ICommon)).ImplementedBy(typeof(CommonImpl1)).Named(i + ".common"));
				ThreadPool.QueueUserWorkItem(removeThread);
			}

			waitEvent.Set();
			while (threadCount > 0 && list.Count == 0)
			{
				Thread.Sleep(15);
			}

			if (list.Count > 0)
			{
				throw list[0];
			}
		}
		public void MultiThreaded_RemoveResolve_Throws_When_LargeRatio_Of_ComponentsToService()
		{
			int threadCount = 1000;
			ArrayList list = ArrayList.Synchronized(new ArrayList());
			Random rand = new Random();
			ManualResetEvent waitEvent = new ManualResetEvent(false);

			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey, new KeySearchNamingSubSystem(delegate { return false; }));

			kernel.AddComponent("common", typeof(ICommon), typeof(CommonImpl1));

			WaitCallback resolveThread = delegate
			                             	{
			                             		waitEvent.WaitOne();
			                             		while(threadCount > 0 && list.Count == 0)
			                             		{
			                             			try
			                             			{
			                             				ICommon common = kernel[typeof(ICommon)] as ICommon;
			                             			}
			                             			catch(Exception e)
			                             			{
			                             				list.Add(e);
			                             			}
			                             		}
			                             	};
			ThreadPool.QueueUserWorkItem(resolveThread);

			WaitCallback removeThread = delegate
			                            	{
			                            		waitEvent.WaitOne();
			                            		kernel.RemoveComponent(threadCount + ".common");
			                            		Interlocked.Decrement(ref threadCount);
			                            	};
			for(int i = 0; i < threadCount; i++)
			{
				kernel.AddComponent(i + ".common", typeof(ICommon), typeof(CommonImpl1));
				ThreadPool.QueueUserWorkItem(removeThread);
			}

			waitEvent.Set();
			while(threadCount > 0 && list.Count == 0)
			{
				Thread.Sleep(15);
			}

			if (list.Count > 0)
			{
				throw (Exception) list[0];
			}
		}
		public void ComponentUnregistersProperly()
		{
			IKernel kernel = new DefaultKernel();

			kernel.AddSubSystem(SubSystemConstants.NamingKey,
			                    new KeySearchNamingSubSystem(delegate(string key) { return key.StartsWith("2"); }));

			kernel.AddComponent("1.common", typeof(ICommon), typeof(CommonImpl1));
			kernel.AddComponent("2.common", typeof(ICommon), typeof(CommonImpl2));

			ICommon common = kernel[typeof(ICommon)] as ICommon;

			Assert.IsNotNull(common);
			Assert.AreEqual(typeof(CommonImpl2), common.GetType());

			kernel.RemoveComponent("2.common");

			common = kernel[typeof(ICommon)] as ICommon;

			Assert.IsNotNull(common);
			Assert.AreEqual(typeof(CommonImpl1), common.GetType());

			kernel.RemoveComponent("1.common");
			Assert.AreEqual(0, kernel.GetHandlers(typeof(ICommon)).Length);
		}
		public void SingleComponentUnregistersProperly()
		{
			IKernel kernel = new DefaultKernel();
			kernel.AddSubSystem(SubSystemConstants.NamingKey,
			                    new KeySearchNamingSubSystem(delegate(string key) { return key.StartsWith("1"); }));

			kernel.Register(Component.For(typeof(ICommon)).ImplementedBy(typeof(CommonImpl1)).Named("1.common"));

			ICommon common = kernel[typeof(ICommon)] as ICommon;

			Assert.IsNotNull(common);
			Assert.AreEqual(typeof(CommonImpl1), common.GetType());

			kernel.RemoveComponent("1.common");

			Assert.IsFalse(kernel.HasComponent("1.common"));
			Assert.IsFalse(kernel.HasComponent(typeof(CommonImpl1)));
			common = kernel[typeof(ICommon)] as ICommon;
		}