public async Task GenerateCode(XbAreaGeneratorModel genModel)
        {
            // When multiple this NuGet packages are installed,
            // depending on the situation, older versions may be used.
            var version = this.GetType().GetTypeInfo().Assembly.GetName().Version.ToString();

            this._logger.LogMessage($"Generator version: {version}");
            this._logger.LogMessage($"Area name: {genModel.AreaName}");

            if (genModel == null)
            {
                throw new ArgumentNullException(nameof(genModel));
            }

            if (string.IsNullOrEmpty(genModel.AreaName))
            {
                throw new ArgumentException(MessageStrings.AreaNameRequired);
            }

            this.EnsureFolderLayout(genModel);

            var readmeGenerator = ActivatorUtilities.CreateInstance <ReadMeGenerator>(this._serviceProvider);

            try
            {
                await readmeGenerator.GenerateReadmeForArea();
            }
            catch (Exception ex)
            {
                _logger.LogMessage($"Failed to generate a readme: {ex.Message}");
                throw ex.Unwrap(_logger);
            }
        }
        /// <summary>
        /// Creates a folder hierarchy:
        ///     ProjectDir
        ///        \ Areas
        ///            \ AreaName
        ///                \ Controllers
        ///                \ Models
        ///                    \ ViewModels
        ///                \ Views
        /// </summary>
        private void EnsureFolderLayout(XbAreaGeneratorModel model)
        {
            var areaBasePath = Path.Combine(_appInfo.ApplicationBasePath, "Areas");

            if (!Directory.Exists(areaBasePath))
            {
                Directory.CreateDirectory(areaBasePath);
            }

            var areaPath = Path.Combine(areaBasePath, model.AreaName);

            if (!Directory.Exists(areaPath))
            {
                Directory.CreateDirectory(areaPath);
            }

            foreach (var areaFolder in AreaFolders)
            {
                var path = Path.Combine(areaPath, areaFolder);
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }

                if (areaFolder == "Models")
                {
                    foreach (var subFolder in ModelSubFolders)
                    {
                        var subPath = Path.Combine(areaPath, areaFolder, subFolder);
                        if (!Directory.Exists(subPath))
                        {
                            Directory.CreateDirectory(subPath);
                        }
                    }
                }
            }
        }