internal static void RemoveComponent(this IKernel kernel, Type type) { INamingSubSystem namingSubSystem = (INamingSubSystem)kernel.GetType().GetProperty("NamingSubSystem", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(kernel); if (!namingSubSystem.Contains(type)) { if (kernel.Parent == null) { return; } RemoveComponent(kernel.Parent, type); return; } IHandler handler = kernel.GetHandler(type); if (handler.ComponentModel.Dependents.Length != 0) { // We can't remove this component as there are // others which depends on it return; } UnRegister(namingSubSystem, type); UnRegister(namingSubSystem, type.FullName); foreach (var service in handler.ComponentModel.Services) { var assignableHandlers = namingSubSystem.GetAssignableHandlers(service); if (assignableHandlers.Length > 0) { IHandler assignableHandler = assignableHandlers[0]; UnRegister(namingSubSystem, assignableHandler.ComponentModel.Services.FirstOrDefault()); UnRegister(namingSubSystem, assignableHandler.ComponentModel.Name); } //if (assignableHandlers.Length > 0) //{ // //namingSubSystem[service] = assignableHandlers[0]; //} //else //{ // UnRegister(namingSubSystem, service); //} } foreach (ComponentModel model in handler.ComponentModel.Dependents) { RemoveDepender(model, handler.ComponentModel); } if (handler is IDisposable) { ((IDisposable)handler).Dispose(); } }