protected ContainerBase(SoftwareSystem softwareSystem, Structurizr.Styles styleContainer, Action <ElementType, string> onCreatedFromExistingElement)
            : base(styleContainer, onCreatedFromExistingElement)
        {
            if (!TryGetMetadata(out string description, out string technology))
            {
                throw new System.Exception($"Missing ContainerAttribute on Container class {GetType().Name}");
            }

            SoftwareSystem = softwareSystem;
            StyleContainer = styleContainer;
            _onCreatedFromExistingElement = onCreatedFromExistingElement;

            Components = new ComponentBase[0];
            Styles     = new ElementStyleBase[0];

            var name      = NamedIdentity.GetNameFromType(GetType());
            var container = softwareSystem.GetContainerWithName(name);

            if (container == null)
            {
                container = softwareSystem.AddContainer(name, description, technology);
            }
            else
            {
                _onCreatedFromExistingElement(ElementType.Element, container.Id);
                container.Description = description;
                container.Technology  = technology;
            }
            Element = Me = container;
        }
        internal C4Builder ComponentUsesContainer(string componentName, string containerName,
                                                  string description, string technology)
        {
            var component = _currentContainer.GetComponentWithName(componentName);
            var container = _currentSoftwareSystem.GetContainerWithName(containerName);

            component.Uses(container, description, technology);

            return(this);
        }