public MariniImpiantoDataManager(string filename, IMariniSerializer serializer, List<IMariniEventHandler> eventHandlerList)
        {
            // TODO: Una qualche validazione del filename? Magari con metodo apposito, o oggetto validatore esterno
            // TODO: una qualche validazione dell'XML? Magari con metodo apposito o con oggetto validatore esterno (vedi XSD)
            XmlDocument doc = new XmlDocument();
            doc.Load(filename);
            XmlNode root = doc.SelectSingleNode("*");
            MariniBaseObject dataTree = (MariniBaseObject)MariniObjectCreator.CreateMariniObject(root);

            _Initialize(dataTree, serializer, eventHandlerList);
        }
 /// <summary>
 /// Initialize the MariniImpiantoDataManager. Sets the mariniImpiantoDataTree and populate the Dictionaries
 /// </summary>
 /// <param name="mariniImpiantoDataTree"></param>
 private void _Initialize(MariniBaseObject dataTree, IMariniSerializer serializer, List<IMariniEventHandler> eventHandlerList)
 {
     // TODO Faccio cosi' o uso un setter???
     this._dataTree = dataTree;
     this._serializer = serializer;
     this._eventHandlerList = eventHandlerList;
     _InitializeDictionaries();
     //foreach (IMariniEventHandler mariniEventsHandler in this._eventHandlerList)
     //{
     //    _SubscribeEvents(mariniEventsHandler);
     //}
     _SubscribeEvents();
 }
        public static MariniGenericObject CreateMariniObject(MariniGenericObject parent, XmlNode node)
        {
            MariniGenericObject mgo;

            // uso il ToLower percui mettere tutto a minuscolo qui e come si vuole nel file xml
            switch (node.Name)
            {
            //case "Impianto":
            //    mgo = new MariniImpianto(parent, node);
            //    break;
            //case "ZonaPredosaggio":
            //    mgo = new MariniZonaPredosaggio(parent, node);
            //    break;
            //case "Predosatore":
            //    mgo = new MariniPredosatore(parent, node);
            //    break;
            case "Property":
                mgo = new MariniProperty(parent, node);
                break;

            default:
                mgo = new MariniBaseObject(parent, node);
                break;
                //    throw new ApplicationException(string.Format("MariniObject '{0}' cannot be created", mgo));
            }

            /* Riempio la lista oggetti con i nodi figli */
            XmlNodeList children = node.ChildNodes;

            foreach (XmlNode child in children)
            {
                if (children.Count > 0)
                {
                    //Console.WriteLine("Parent id: {0} node.childnodes = {1}", mgo.id, node.ChildNodes.Count);
                    mgo.ChildList.Add(CreateMariniObject(mgo, child));
                }
            }

            /* restituisco l'oggetto creato: GOF factory pattern */
            return(mgo);
        }
 //Nei costruttori faccio Dependency Injection / Inversion of Control, ovvero sposto il codice su oggetti esterni.
 public MariniImpiantoDataManager(MariniBaseObject dataTree, IMariniSerializer serializer, List <IMariniEventHandler> eventHandlerList)
 {
     _Initialize(dataTree, serializer, eventHandlerList);   
 }