/// <summary>
        /// Use flat area folders with custom options
        /// </summary>
        public static IMvcBuilder AddFlatAreas(this IMvcBuilder services, FlatAreaOptions options)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }
            if (options == null)
            {
                throw new ArgumentException(nameof(options));
            }

            var expander = new FlatAreaExpander(options);

            services.AddMvcOptions(o =>
            {
                o.Conventions.Add(new FlatAreaConvention(options));
            })
            .AddRazorOptions(o =>
            {
                // Helps finding shared and other fully qualified resources
                o.ViewLocationFormats.Clear();
                o.ViewLocationFormats.Add(options.AreaPlaceholder + @"\{0}.cshtml");
                o.ViewLocationFormats.Add(options.RootFolderName + @"\_Base\{0}.cshtml");
                o.ViewLocationFormats.Add(options.RootFolderName + @"\_Related\{0}.cshtml");
                o.ViewLocationFormats.Add(options.RootFolderName + @"\{0}.cshtml"); // locates fully-qualified partial views
                o.ViewLocationExpanders.Add(expander);
            });

            return(services);
        }
 public FlatAreaExpander(FlatAreaOptions options)
 {
     _placeholder = options.AreaPlaceholder;
 }
 public FlatAreaConvention(FlatAreaOptions options)
 {
     _folderName             = options.RootFolderName;
     _nameDerivationStrategy = options.DeriveFolderName ?? DeriveAreaFolderName;
 }