private void LoadXmlIfNeeded()
        {
            if (_environmentInfosXml != null)
              {
            return;
              }

              var xmlSerializer = new XmlSerializer(typeof(EnvironmentInfosXml));

              using (var fs = File.OpenRead(_xmlFilePath))
              {
            _environmentInfosXml = (EnvironmentInfosXml)xmlSerializer.Deserialize(fs);
              }

              _environmentInfosByName =
            _environmentInfosXml.EnvironmentInfos
              .Select(
            eiXml =>
            new EnvironmentInfo(
              eiXml.Name,
              eiXml.ConfigurationTemplateName,
              eiXml.AppServerMachineName,
              eiXml.FailoverClusterMachineName,
              eiXml.WebServerMachineNames,
              eiXml.TerminalServerMachineName,
              eiXml.DatabaseServerMachineName,
              eiXml.NtServicesBaseDirPath,
              eiXml.WebAppsBaseDirPath,
              eiXml.SchedulerAppsBaseDirPath,
              eiXml.TerminalAppsBaseDirPath,
              eiXml.EnableFailoverClusteringForNtServices,
              eiXml.EnvironmentUsers.Select(
                eu =>
                new EnvironmentUser(
                  eu.Id,
                  eu.UserName)),
              eiXml.ProjectToFailoverClusterGroupMappings.Select(
                ptfcgm =>
                new ProjectToFailoverClusterGroupMapping(
                  ptfcgm.ProjectName,
                  ptfcgm.ClusterGroupName))))
              .ToDictionary(ei => ei.Name);
        }
        private void LoadXmlIfNeeded()
        {
            if (_environmentInfosXml != null)
              {
            return;
              }

              var xmlSerializer = new XmlSerializer(typeof(EnvironmentInfosXml));

              using (var fs = File.OpenRead(_xmlFilePath))
              {
            _environmentInfosXml = (EnvironmentInfosXml)xmlSerializer.Deserialize(fs);
              }

              _environmentInfosByName =
            _environmentInfosXml.EnvironmentInfos
              .Select(
            eiXml =>
            new EnvironmentInfo(
              eiXml.Name,
              eiXml.ConfigurationTemplateName,
              eiXml.AppServerMachineName,
              eiXml.FailoverClusterMachineName,
              eiXml.WebServerMachineNames,
              eiXml.TerminalServerMachineName,
              eiXml.SchedulerServerTasksMachineNames,
              eiXml.SchedulerServerBinariesMachineNames,
              eiXml.NtServicesBaseDirPath,
              eiXml.WebAppsBaseDirPath,
              eiXml.SchedulerAppsBaseDirPath,
              eiXml.TerminalAppsBaseDirPath,
              eiXml.EnableFailoverClusteringForNtServices,
              eiXml.EnvironmentUsers.Select(
                e =>
                new EnvironmentUser(
                  e.Id,
                  e.UserName)),
              eiXml.AppPoolInfos.Select(
                e =>
                new IisAppPoolInfo(
                  e.Name,
                  e.Version,
                  e.Mode)),
              eiXml.DatabaseServers.Select(
                e =>
                new DatabaseServer(
                  e.Id,
                  e.MachineName)),
              eiXml.WebAppProjectConfigurations.Select(
                e =>
                new WebAppProjectConfiguration(
                  e.ProjectName,
                  e.AppPoolId,
                  e.WebSiteName,
                  e.WebAppDirName,
                  e.WebAppName)),
              eiXml.ProjectToFailoverClusterGroupMappings.Select(
                e =>
                new ProjectToFailoverClusterGroupMapping(
                  e.ProjectName,
                  e.ClusterGroupName)),
              eiXml.DbProjectConfigurations.Select(
                e =>
                new DbProjectConfiguration(
                  e.ProjectName,
                  e.DatabaseServerId)),
              eiXml.TerminalAppsShortcutFolder,
              eiXml.ManualDeploymentPackageDirPath
              ))
              .ToDictionary(ei => ei.Name);
        }