コード例 #1
0
ファイル: Container.cs プロジェクト: Qorpent/qorpent.sys
        /// <summary>
        ///     Отменяет регистрацию компонента
        /// </summary>
        /// <param name="component"> компонент, который должен быть убран из контейнера </param>
        /// <remarks>
        ///     <note>Очевидно что, такой метод обязан присутствовать в интерфейсе контейнера, однако его использование в задачах помимо тестирования,
        ///         обозначает недостатки архитектуры приложения, так как в нормальном варианте использования контейнер меняет свое поведение по принципу наращивания
        ///         обслуживаемых классов и компонентов, тогда как удаление части компонент может привести к неожиданным эффектам в случае кэширования более
        ///         ранеей выдвачи клиентской стороной</note>
        /// </remarks>
        public void Unregister(IComponentDefinition component)
        {
            lock (this) {
                if (null == component)
                {
                    return;
                }
                if (!Components.Contains(component))
                {
                    return;
                }
                Components.Remove(component);
                ByTypeCache[component.ServiceType].Remove(component);
                if (component.Name.IsNotEmpty())
                {
                    ByNameCache[component.Name].Remove(component);
                }
                foreach (var componentDefinition in OutgoingCache.ToArray())
                {
                    if (Equals(componentDefinition.Value, component))
                    {
                        DropObject(componentDefinition.Key);
                        OutgoingCache.Remove(componentDefinition.Key);
                    }
                }
                if (Lifestyle.PerThread == component.Lifestyle)
                {
                    foreach (var threadCache in ThreadOutgoingCache.ToArray())
                    {
                        foreach (var componentDefinition in threadCache.Value.ToArray())
                        {
                            if (Equals(componentDefinition.Value, component))
                            {
                                DropObject(componentDefinition.Key);
                                OutgoingCache.Remove(componentDefinition.Key);
                            }
                        }
                    }
                }
                if (Lifestyle.Pooled == component.Lifestyle)
                {
                    if (Pool.ContainsKey(component))
                    {
                        foreach (var obj in Pool[component])
                        {
                            DropObject(obj);
                        }
                        Pool.Remove(component);
                    }
                }

                // hook for extensions - UnRegisterComponent extensions can do something after it's
                // native unregistration
                ProcessExtensions(new ContainerContext {
                    Operation = ContainerOperation.UnregisterComponent, Component = component
                });
            }
        }