public static void SetUp(Container container)
        {
            bool     enableLocalization               = true;
            string   absoluteFileName                 = HostingEnvironment.MapPath("~/Mvc.sitemap");
            TimeSpan absoluteCacheExpiration          = TimeSpan.FromMinutes(5);
            bool     visibilityAffectsDescendants     = true;
            bool     useTitleIfDescriptionNotProvided = true;

#if Demo
            // Settings for MvcMusicStore demo: don't copy into your project
            bool     securityTrimmingEnabled  = true;
            string[] includeAssembliesForScan = new string[] { "Mvc Music Store" };
#else
            bool     securityTrimmingEnabled  = false;
            string[] includeAssembliesForScan = new string[] { "$AssemblyName$" };
#endif

            // Extension to allow resolution of arrays by GetAllInstances (natively based on IEnumerable).
            // source from: https://simpleinjector.codeplex.com/wikipage?title=CollectionRegistrationExtensions
            AllowToResolveArraysAndLists(container);

            var currentAssembly         = typeof(MvcSiteMapProviderContainerInitializer).Assembly;
            var siteMapProviderAssembly = typeof(SiteMaps).Assembly;
            var allAssemblies           = new Assembly[] { currentAssembly, siteMapProviderAssembly };
            var excludeTypes            = new Type[]
            {
                // Use this array to add types you wish to explicitly exclude from convention-based
                // auto-registration. By default all types that either match I[TypeName] = [TypeName] or
                // I[TypeName] = [TypeName]Adapter will be automatically wired up as long as they don't
                // have the [ExcludeFromAutoRegistrationAttribute].
                //
                // If you want to override a type that follows the convention, you should add the name
                // of either the implementation name or the interface that it inherits to this list and
                // add your manual registration code below. This will prevent duplicate registrations
                // of the types from occurring.

                // Example:
                // typeof(SiteMap),
                // typeof(SiteMapNodeVisibilityProviderStrategy)
            };
            var multipleImplementationTypes = new Type[]
            {
                typeof(ISiteMapNodeUrlResolver),
                typeof(ISiteMapNodeVisibilityProvider),
                typeof(IDynamicNodeProvider)
            };

            // Matching type name (I[TypeName] = [TypeName]) or matching type name + suffix Adapter (I[TypeName] = [TypeName]Adapter)
            // and not decorated with the [ExcludeFromAutoRegistrationAttribute].
            CommonConventions.RegisterDefaultConventions(
                (interfaceType, implementationType) => container.RegisterSingle(interfaceType, implementationType),
                new Assembly[] { siteMapProviderAssembly },
                allAssemblies,
                excludeTypes,
                string.Empty);

            // Multiple implementations of strategy based extension points (and not decorated with [ExcludeFromAutoRegistrationAttribute]).
            CommonConventions.RegisterAllImplementationsOfInterfaceSingle(
                (interfaceType, implementationTypes) => container.RegisterAll(interfaceType, implementationTypes),
                multipleImplementationTypes,
                allAssemblies,
                excludeTypes,
                string.Empty);

            container.Register <XmlSiteMapController>();

            // Visibility Providers
            container.RegisterSingle <ISiteMapNodeVisibilityProviderStrategy>(() =>
                                                                              new SiteMapNodeVisibilityProviderStrategy(
                                                                                  container.GetAllInstances <ISiteMapNodeVisibilityProvider>().ToArray(), string.Empty));

            // Pass in the global controllerBuilder reference
            container.RegisterSingle <ControllerBuilder>(() => ControllerBuilder.Current);

            container.RegisterSingle <IControllerTypeResolverFactory>(() =>
                                                                      new ControllerTypeResolverFactory(
                                                                          new string[0],
                                                                          container.GetInstance <IControllerBuilder>(),
                                                                          container.GetInstance <IBuildManager>()));

            // Configure Security
            container.RegisterAll <IAclModule>(typeof(AuthorizeAttributeAclModule), typeof(XmlRolesAclModule));
            container.RegisterSingle <IAclModule>(() => new CompositeAclModule(container.GetAllInstances <IAclModule>().ToArray()));

            // Setup cache
#if NET35
            container.RegisterSingleOpenGeneric(typeof(ICacheProvider <>), typeof(AspNetCacheProvider <>));
            container.RegisterSingle <ICacheDependency>(() => new AspNetFileCacheDependency(absoluteFileName));
#else
            container.RegisterSingle <System.Runtime.Caching.ObjectCache>(() => System.Runtime.Caching.MemoryCache.Default);
            container.RegisterSingleOpenGeneric(typeof(ICacheProvider <>), typeof(RuntimeCacheProvider <>));
            container.RegisterSingle <ICacheDependency>(() => new RuntimeFileCacheDependency(absoluteFileName));
#endif
            container.RegisterSingle <ICacheDetails>(() => new CacheDetails(absoluteCacheExpiration, TimeSpan.MinValue, container.GetInstance <ICacheDependency>()));

            // Configure the visitors
            container.RegisterSingle <ISiteMapNodeVisitor, UrlResolvingSiteMapNodeVisitor>();

            // Prepare for the sitemap node providers
            container.RegisterSingle <IReservedAttributeNameProvider>(() => new ReservedAttributeNameProvider(new string[0]));
            container.RegisterSingle <IXmlSource>(() => new FileXmlSource(absoluteFileName));

            // Register the sitemap node providers
            container.RegisterSingle <XmlSiteMapNodeProvider>(() => container.GetInstance <XmlSiteMapNodeProviderFactory>()
                                                              .Create(container.GetInstance <IXmlSource>()));
            container.RegisterSingle <ReflectionSiteMapNodeProvider>(() => container.GetInstance <ReflectionSiteMapNodeProviderFactory>()
                                                                     .Create(includeAssembliesForScan));

            // Register the sitemap builders
            container.RegisterSingle <ISiteMapBuilder>(() => container.GetInstance <SiteMapBuilderFactory>()
                                                       .Create(new CompositeSiteMapNodeProvider(container.GetInstance <XmlSiteMapNodeProvider>(), container.GetInstance <ReflectionSiteMapNodeProvider>())));

            container.RegisterAll <ISiteMapBuilderSet>(
                ResolveISiteMapBuilderSets(container, securityTrimmingEnabled, enableLocalization, visibilityAffectsDescendants, useTitleIfDescriptionNotProvided));
            container.RegisterSingle <ISiteMapBuilderSetStrategy>(() => new SiteMapBuilderSetStrategy(container.GetAllInstances <ISiteMapBuilderSet>().ToArray()));
        }
        public static void SetUp(Container container)
        {
            bool     securityTrimmingEnabled = false;
            bool     enableLocalization      = true;
            string   absoluteFileName        = HostingEnvironment.MapPath("~/Mvc.sitemap");
            TimeSpan absoluteCacheExpiration = TimeSpan.FromMinutes(5);

            string[] includeAssembliesForScan = new string[] { "$AssemblyName$" };

            // Extension to allow resolution of arrays by GetAllInstances (natively based on IEnumerable).
            // source from: https://simpleinjector.codeplex.com/wikipage?title=CollectionRegistrationExtensions
            AllowToResolveArraysAndLists(container);

            var currentAssembly         = typeof(MvcSiteMapProviderContainerInitializer).Assembly;
            var siteMapProviderAssembly = typeof(SiteMaps).Assembly;
            var allAssemblies           = new Assembly[] { currentAssembly, siteMapProviderAssembly };
            var excludeTypes            = new Type[]
            {
                typeof(SiteMapNodeVisibilityProviderStrategy),
                typeof(SiteMapXmlReservedAttributeNameProvider),
                typeof(SiteMapBuilderSetStrategy),
                typeof(ControllerTypeResolverFactory),

                // Added 2013-06-28 by eric-b to avoid default singleton registration:
                typeof(XmlSiteMapController),

                // Added 2013-06-28 by eric-b for SimpleInjector.Verify method:
                typeof(PreservedRouteParameterCollection),
                typeof(MvcResolver),
                typeof(MvcSiteMapProvider.SiteMap),
                typeof(MetaRobotsValueCollection),
                typeof(RoleCollection),
                typeof(SiteMapPluginProvider),
                typeof(ControllerTypeResolver),
                typeof(RouteValueDictionary),
                typeof(AttributeDictionary)
            };
            var multipleImplementationTypes = new Type[]
            {
                typeof(ISiteMapNodeUrlResolver),
                typeof(ISiteMapNodeVisibilityProvider),
                typeof(IDynamicNodeProvider)
            };

            // Single implementations of interface with matching name (minus the "I").
            CommonConventions.RegisterDefaultConventions(
                (interfaceType, implementationType) => container.RegisterSingle(interfaceType, implementationType),
                new Assembly[] { siteMapProviderAssembly },
                allAssemblies,
                excludeTypes,
                string.Empty);

            // Multiple implementations of strategy based extension points
            CommonConventions.RegisterAllImplementationsOfInterfaceSingle(
                (interfaceType, implementationTypes) => container.RegisterAll(interfaceType, implementationTypes),
                multipleImplementationTypes,
                allAssemblies,
                new Type[0],
                "^Composite");

            container.Register <XmlSiteMapController>();

            // Visibility Providers
            container.RegisterSingle <ISiteMapNodeVisibilityProviderStrategy>(() =>
                                                                              new SiteMapNodeVisibilityProviderStrategy(
                                                                                  container.GetAllInstances
                                                                                  <ISiteMapNodeVisibilityProvider>().
                                                                                  ToArray(), string.Empty));

            // Pass in the global controllerBuilder reference
            container.RegisterSingle <ControllerBuilder>(() => ControllerBuilder.Current);

            container.RegisterSingle <IControllerBuilder, ControllerBuilderAdaptor>();

            container.RegisterSingle <IBuildManager, BuildManagerAdaptor>();

            container.RegisterSingle <IControllerTypeResolverFactory>(() =>
                                                                      new ControllerTypeResolverFactory(new string[0],
                                                                                                        container.GetInstance
                                                                                                        <IControllerBuilder
                                                                                                        >(),
                                                                                                        container.GetInstance
                                                                                                        <IBuildManager>()));

            // Configure Security
            container.RegisterSingle <AuthorizeAttributeAclModule>(() => new AuthorizeAttributeAclModule(
                                                                       container.GetInstance <IMvcContextFactory>(),
                                                                       container.GetInstance <IObjectCopier>(),
                                                                       container.GetInstance <IControllerDescriptorFactory>(),
                                                                       container.GetInstance <IControllerBuilder>(),
                                                                       container.GetInstance <IAuthorizeAttributeBuilder>(),
                                                                       container.GetInstance <IGlobalFilterProvider>()));

            container.RegisterAll <IAclModule>(typeof(AuthorizeAttributeAclModule), typeof(XmlRolesAclModule));
            container.RegisterSingle <IAclModule>(() => new CompositeAclModule(container.GetAllInstances <IAclModule>().ToArray()));

            // Setup cache
#if NET35
            container.RegisterSingle <ICacheProvider <ISiteMap>, AspNetCacheProvider <ISiteMap> >();
            container.RegisterSingle <ICacheDependency>(() => new AspNetFileCacheDependency(absoluteFileName));
#else
            container.RegisterSingle <System.Runtime.Caching.ObjectCache>(() => System.Runtime.Caching.MemoryCache.Default);
            container.RegisterSingle <ICacheProvider <ISiteMap>, RuntimeCacheProvider <ISiteMap> >();
            container.RegisterSingle <ICacheDependency>(() => new RuntimeFileCacheDependency(absoluteFileName));
#endif
            container.RegisterSingle <ICacheDetails>(() => new CacheDetails(absoluteCacheExpiration, TimeSpan.MinValue, container.GetInstance <ICacheDependency>()));

            // Configure the visitors
            container.RegisterSingle <ISiteMapNodeVisitor, UrlResolvingSiteMapNodeVisitor>();


            // Register the sitemap builder
            container.RegisterSingle <ISiteMapXmlReservedAttributeNameProvider>(
                () => new SiteMapXmlReservedAttributeNameProvider(new string[0]));

            container.RegisterSingle <IXmlSource>(() => new FileXmlSource(absoluteFileName));


            container.RegisterSingle <XmlSiteMapBuilder>(() =>
                                                         new XmlSiteMapBuilder(
                                                             container.GetInstance <IXmlSource>(),
                                                             container.GetInstance <ISiteMapXmlReservedAttributeNameProvider>(),
                                                             container.GetInstance <INodeKeyGenerator>(),
                                                             container.GetInstance <IDynamicNodeBuilder>(),
                                                             container.GetInstance <ISiteMapNodeFactory>(),
                                                             container.GetInstance <ISiteMapXmlNameProvider>()
                                                             ));

            container.RegisterSingle <ReflectionSiteMapBuilder>(() =>
                                                                new ReflectionSiteMapBuilder(
                                                                    includeAssembliesForScan,
                                                                    new string[0],
                                                                    container.GetInstance
                                                                    <ISiteMapXmlReservedAttributeNameProvider>(),
                                                                    container.GetInstance <INodeKeyGenerator>(),
                                                                    container.GetInstance <IDynamicNodeBuilder>(),
                                                                    container.GetInstance <ISiteMapNodeFactory>(),
                                                                    container.GetInstance <ISiteMapCacheKeyGenerator>()
                                                                    ));

            container.RegisterAll <ISiteMapBuilderSet>(ResolveISiteMapBuilderSets(container, securityTrimmingEnabled, enableLocalization));
            container.RegisterSingle <ISiteMapBuilderSetStrategy>(() => new SiteMapBuilderSetStrategy(container.GetAllInstances <ISiteMapBuilderSet>().ToArray()));

            container.RegisterSingle <VisitingSiteMapBuilder>();
        }
        public static void SetUp(Container container)
        {
            bool enableLocalization = true;
            // xml not supported yet
            //string absoluteFileName = HostingEnvironment.MapPath("~/Mvc.sitemap");
            TimeSpan absoluteCacheExpiration          = TimeSpan.FromMinutes(5);
            bool     visibilityAffectsDescendants     = true;
            bool     useTitleIfDescriptionNotProvided = true;
            bool     securityTrimmingEnabled          = false;

            string[] includeAssembliesForScan = new string[] { "DemoApp" };


// Extension to allow resolution of arrays by GetAllInstances (natively based on IEnumerable).
// source from: https://simpleinjector.codeplex.com/wikipage?title=CollectionRegistrationExtensions
            container.AllowToResolveArraysAndLists();

            var currentAssembly         = typeof(MvcSiteMapProviderContainerInitializer).Assembly;
            var siteMapProviderAssembly = typeof(SiteMaps).Assembly;
            var allAssemblies           = new Assembly[] { currentAssembly, siteMapProviderAssembly };
            var excludeTypes            = new Type[]
            {
                typeof(IMvcContextFactory),
                // xml not supported yet
                typeof(MvcSiteMapProvider.Xml.ISiteMapXmlValidator),
                typeof(MvcSiteMapProvider.Xml.ISiteMapXmlNameProvider),
                typeof(IXmlSiteMapResultFactory)
            };
            var multipleImplementationTypes = new Type[]
            {
                typeof(ISiteMapNodeUrlResolver),
                typeof(ISiteMapNodeVisibilityProvider),
                typeof(IDynamicNodeProvider)
            };

// Matching type name (I[TypeName] = [TypeName]) or matching type name + suffix Adapter (I[TypeName] = [TypeName]Adapter)
// and not decorated with the [ExcludeFromAutoRegistrationAttribute].
            CommonConventions.RegisterDefaultConventions(
                (interfaceType, implementationType) => container.Register(interfaceType, implementationType),
                new Assembly[] { siteMapProviderAssembly },
                allAssemblies,
                excludeTypes,
                string.Empty);

// Multiple implementations of strategy based extension points (and not decorated with [ExcludeFromAutoRegistrationAttribute]).
            CommonConventions.RegisterAllImplementationsOfInterfaceSingle(
                (interfaceType, implementationTypes) => container.RegisterCollection(interfaceType, implementationTypes),
                multipleImplementationTypes,
                allAssemblies,
                excludeTypes,
                string.Empty);

            // xml not supported yet
            //container.RegisterMvcController<XmlSiteMapController>();

            container.Register <IMvcContextFactory, MvcContextFactory>(Lifestyle.Singleton);

// Visibility Providers
            container.Register <ISiteMapNodeVisibilityProviderStrategy>(() =>
                                                                        new SiteMapNodeVisibilityProviderStrategy(
                                                                            container.GetAllInstances <ISiteMapNodeVisibilityProvider>().ToArray(), string.Empty),
                                                                        Lifestyle.Singleton);

// Pass in the global controllerBuilder reference
            container.Register <ControllerBuilder>(() => ControllerBuilder.Current, Lifestyle.Singleton);

            container.Register <IControllerTypeResolverFactory>(() =>
                                                                new ControllerTypeResolverFactory(
                                                                    new string[0],
                                                                    container.GetInstance <IControllerBuilder>(),
                                                                    container.GetInstance <IBuildManager>()),
                                                                Lifestyle.Singleton);

// Configure Security
            // xml not supported yet (disable XmlRolesAclModule)
            container.RegisterCollection(typeof(IAclModule), new Type[] { typeof(AuthorizeAttributeAclModule) /*, typeof(XmlRolesAclModule)*/ });
            container.Register <IAclModule>(() => new CompositeAclModule(container.GetAllInstances <IAclModule>().ToArray()), Lifestyle.Singleton);

// Setup cache
            container.Register <System.Runtime.Caching.ObjectCache>(() => System.Runtime.Caching.MemoryCache.Default, Lifestyle.Singleton);
            container.RegisterOpenGeneric(typeof(ICacheProvider <>), typeof(RuntimeCacheProvider <>), Lifestyle.Singleton);
            // xml not supported yet
            //container.Register<ICacheDependency>(() => new RuntimeFileCacheDependency(absoluteFileName), Lifestyle.Singleton);
            container.Register <ICacheDependency>(() => new NullCacheDependency(), Lifestyle.Singleton);

            container.Register <ICacheDetails>(() => new CacheDetails(absoluteCacheExpiration, TimeSpan.MinValue, container.GetInstance <ICacheDependency>()), Lifestyle.Singleton);

// Configure the visitors
            container.Register <ISiteMapNodeVisitor, UrlResolvingSiteMapNodeVisitor>(Lifestyle.Singleton);

// Prepare for the sitemap node providers
            container.Register <IReservedAttributeNameProvider>(() => new ReservedAttributeNameProvider(new string[0]), Lifestyle.Singleton);
            // xml not supported yet
            //container.Register<IXmlSource>(() => new FileXmlSource(absoluteFileName), Lifestyle.Singleton);

// Register the sitemap node providers
            // xml not supported yet
            //container.Register<XmlSiteMapNodeProvider>(() => container.GetInstance<XmlSiteMapNodeProviderFactory>()
            //	.Create(container.GetInstance<IXmlSource>()),
            //	Lifestyle.Singleton);
            container.Register <ReflectionSiteMapNodeProvider>(() => container.GetInstance <ReflectionSiteMapNodeProviderFactory>()
                                                               .Create(includeAssembliesForScan),
                                                               Lifestyle.Singleton);

// Register the sitemap builders
            // xml not supported yet
            //container.Register<ISiteMapBuilder>(() => container.GetInstance<SiteMapBuilderFactory>()
            //	.Create(new CompositeSiteMapNodeProvider(container.GetInstance<XmlSiteMapNodeProvider>(), container.GetInstance<ReflectionSiteMapNodeProvider>())),
            //	Lifestyle.Singleton);
            container.Register <ISiteMapBuilder>(() => container.GetInstance <SiteMapBuilderFactory>()
                                                 .Create(container.GetInstance <ReflectionSiteMapNodeProvider>()), Lifestyle.Singleton);

            container.RegisterCollection <ISiteMapBuilderSet>(
                ResolveISiteMapBuilderSets(container, securityTrimmingEnabled, enableLocalization, visibilityAffectsDescendants, useTitleIfDescriptionNotProvided));
            container.Register <ISiteMapBuilderSetStrategy>(() => new SiteMapBuilderSetStrategy(container.GetAllInstances <ISiteMapBuilderSet>().ToArray()),
                                                            Lifestyle.Singleton);
        }