/// <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 }); } }