예제 #1
0
        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();
            }
        }