public void ExtractBasicParametersExtractsNumbersAndStrings()
        {
            var actual = string.Join(' ',
                                     CommonConventions.ExtractBasicParameters("abc 1 def '12' ghi \"123\" jkl 12.34 mno True pqr false"));

            Assert.AreEqual("1 12 123 12.34 True false", actual);
        }
Beispiel #2
0
        public MvcSiteMapProviderRegistry()
        {
            bool     enableLocalization               = true;
            string   absoluteFileName                 = HostingEnvironment.MapPath("~/Mvc.sitemap");
            TimeSpan absoluteCacheExpiration          = TimeSpan.FromMinutes(5);
            bool     visibilityAffectsDescendants     = true;
            bool     useTitleIfDescriptionNotProvided = true;



            bool securityTrimmingEnabled = false;

            string[] includeAssembliesForScan = new string[] { "QEP.ONRR.Web" };


            var currentAssembly             = this.GetType().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) => this.For(interfaceType).Singleton().Use(implementationType),
                new Assembly[] { siteMapProviderAssembly },
                allAssemblies,
                excludeTypes,
                string.Empty);

// Multiple implementations of strategy based extension points (and not decorated with [ExcludeFromAutoRegistrationAttribute]).
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => this.For(interfaceType).Singleton().Use(implementationType),
                multipleImplementationTypes,
                allAssemblies,
                excludeTypes,
                string.Empty);

// Visibility Providers
            this.For <ISiteMapNodeVisibilityProviderStrategy>().Use <SiteMapNodeVisibilityProviderStrategy>()
            .Ctor <string>("defaultProviderName").Is(string.Empty);

// Pass in the global controllerBuilder reference
            this.For <ControllerBuilder>()
            .Use(x => ControllerBuilder.Current);

            this.For <IControllerTypeResolverFactory>().Use <ControllerTypeResolverFactory>()
            .Ctor <string[]>("areaNamespacesToIgnore").Is(new string[0]);

// Configure Security
            this.For <IAclModule>().Use <CompositeAclModule>()
            .EnumerableOf <IAclModule>().Contains(x =>
            {
                x.Type <AuthorizeAttributeAclModule>();
                x.Type <XmlRolesAclModule>();
            });

// Setup cache
            SmartInstance <CacheDetails> cacheDetails;


            this.For <System.Runtime.Caching.ObjectCache>()
            .Use(s => System.Runtime.Caching.MemoryCache.Default);

            this.For(typeof(ICacheProvider <>)).Use(typeof(RuntimeCacheProvider <>));

            var cacheDependency =
                this.For <ICacheDependency>().Use <RuntimeFileCacheDependency>()
                .Ctor <string>("fileName").Is(absoluteFileName);

            cacheDetails =
                this.For <ICacheDetails>().Use <CacheDetails>()
                .Ctor <TimeSpan>("absoluteCacheExpiration").Is(absoluteCacheExpiration)
                .Ctor <TimeSpan>("slidingCacheExpiration").Is(TimeSpan.MinValue)
                .Ctor <ICacheDependency>().Is(cacheDependency);

// Configure the visitors
            this.For <ISiteMapNodeVisitor>()
            .Use <UrlResolvingSiteMapNodeVisitor>();


// Prepare for our node providers
            var xmlSource = this.For <IXmlSource>().Use <FileXmlSource>()
                            .Ctor <string>("fileName").Is(absoluteFileName);

            this.For <IReservedAttributeNameProvider>().Use <ReservedAttributeNameProvider>()
            .Ctor <IEnumerable <string> >("attributesToIgnore").Is(new string[0]);

// Register the sitemap node providers
            var siteMapNodeProvider = this.For <ISiteMapNodeProvider>().Use <CompositeSiteMapNodeProvider>()
                                      .EnumerableOf <ISiteMapNodeProvider>().Contains(x =>
            {
                x.Type <XmlSiteMapNodeProvider>()
                .Ctor <bool>("includeRootNode").Is(true)
                .Ctor <bool>("useNestedDynamicNodeRecursion").Is(false)
                .Ctor <IXmlSource>().Is(xmlSource);
                x.Type <ReflectionSiteMapNodeProvider>()
                .Ctor <IEnumerable <string> >("includeAssemblies").Is(includeAssembliesForScan)
                .Ctor <IEnumerable <string> >("excludeAssemblies").Is(new string[0]);
            });

// Register the sitemap builders
            var builder = this.For <ISiteMapBuilder>().Use <SiteMapBuilder>()
                          .Ctor <ISiteMapNodeProvider>().Is(siteMapNodeProvider);

// Configure the builder sets
            this.For <ISiteMapBuilderSetStrategy>().Use <SiteMapBuilderSetStrategy>()
            .EnumerableOf <ISiteMapBuilderSet>().Contains(x =>
            {
                x.Type <SiteMapBuilderSet>()
                .Ctor <string>("instanceName").Is("default")
                .Ctor <bool>("securityTrimmingEnabled").Is(securityTrimmingEnabled)
                .Ctor <bool>("enableLocalization").Is(enableLocalization)
                .Ctor <bool>("visibilityAffectsDescendants").Is(visibilityAffectsDescendants)
                .Ctor <bool>("useTitleIfDescriptionNotProvided").Is(useTitleIfDescriptionNotProvided)
                .Ctor <ISiteMapBuilder>().Is(builder)
                .Ctor <ICacheDetails>().Is(cacheDetails);
            });
        }
        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>();
        }
Beispiel #4
0
        protected override void Initialize()
        {
            bool     enableLocalization               = true;
            string   absoluteFileName                 = HostingEnvironment.MapPath("~/Mvc.sitemap");
            TimeSpan absoluteCacheExpiration          = TimeSpan.FromMinutes(5);
            bool     visibilityAffectsDescendants     = true;
            bool     useTitleIfDescriptionNotProvided = true;



            bool securityTrimmingEnabled = true;

            string[] includeAssembliesForScan = new string[] { "JB.Sample.MvcSiteMap.Website" };


            var currentAssembly             = this.GetType().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) => this.Container.RegisterType(interfaceType, implementationType, new ContainerControlledLifetimeManager()),
                new Assembly[] { siteMapProviderAssembly },
                allAssemblies,
                excludeTypes,
                string.Empty);

            // Multiple implementations of strategy based extension points (and not decorated with [ExcludeFromAutoRegistrationAttribute]).
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => this.Container.RegisterType(interfaceType, implementationType, implementationType.Name, new ContainerControlledLifetimeManager()),
                multipleImplementationTypes,
                allAssemblies,
                excludeTypes,
                string.Empty);

            // TODO: Find a better way to inject an array constructor

            // Url Resolvers
            this.Container.RegisterType <ISiteMapNodeUrlResolverStrategy, SiteMapNodeUrlResolverStrategy>(new InjectionConstructor(
                                                                                                              new ResolvedArrayParameter <ISiteMapNodeUrlResolver>(this.Container.ResolveAll <ISiteMapNodeUrlResolver>().ToArray())
                                                                                                              ));

            // CacheKey Generator
            this.Container.RegisterType <ISiteMapCacheKeyGenerator, SessionBasedSiteMapCacheKeyGenerator>();


            // Visibility Providers
            this.Container.RegisterType <ISiteMapNodeVisibilityProviderStrategy, SiteMapNodeVisibilityProviderStrategy>(new InjectionConstructor(
                                                                                                                            new ResolvedArrayParameter <ISiteMapNodeVisibilityProvider>(this.Container.ResolveAll <ISiteMapNodeVisibilityProvider>().ToArray()),
                                                                                                                            new InjectionParameter <string>(string.Empty)
                                                                                                                            ));

            // Dynamic Node Providers
            this.Container.RegisterType <IDynamicNodeProviderStrategy, DynamicNodeProviderStrategy>(new InjectionConstructor(
                                                                                                        new ResolvedArrayParameter <IDynamicNodeProvider>(this.Container.ResolveAll <IDynamicNodeProvider>().ToArray())
                                                                                                        ));


            // Pass in the global controllerBuilder reference
            this.Container.RegisterInstance <ControllerBuilder>(ControllerBuilder.Current);

            this.Container.RegisterType <IControllerTypeResolverFactory, ControllerTypeResolverFactory>(new InjectionConstructor(
                                                                                                            new List <string>(),
                                                                                                            new ResolvedParameter <IControllerBuilder>(),
                                                                                                            new ResolvedParameter <IBuildManager>()));

            // Configure Security

            // IMPORTANT: Must give arrays of object a name in Unity in order for it to resolve them.
            this.Container.RegisterType <IAclModule, AuthorizeAttributeAclModule>("authorizeAttribute");
            this.Container.RegisterType <IAclModule, XmlRolesAclModule>("xmlRoles");
            this.Container.RegisterType <IAclModule, CompositeAclModule>(new InjectionConstructor(new ResolvedArrayParameter <IAclModule>(
                                                                                                      new ResolvedParameter <IAclModule>("authorizeAttribute"),
                                                                                                      new ResolvedParameter <IAclModule>("xmlRoles"))));



            this.Container.RegisterInstance <System.Runtime.Caching.ObjectCache>(System.Runtime.Caching.MemoryCache.Default);
            this.Container.RegisterType(typeof(ICacheProvider <>), typeof(RuntimeCacheProvider <>));
            this.Container.RegisterType <ICacheDependency, RuntimeFileCacheDependency>(
                "cacheDependency", new InjectionConstructor(absoluteFileName));

            this.Container.RegisterType <ICacheDetails, CacheDetails>("cacheDetails",
                                                                      new InjectionConstructor(absoluteCacheExpiration, TimeSpan.MinValue, new ResolvedParameter <ICacheDependency>("cacheDependency")));

            // Configure the visitors
            this.Container.RegisterType <ISiteMapNodeVisitor, UrlResolvingSiteMapNodeVisitor>();

            // Prepare for the sitemap node providers
            this.Container.RegisterType <IXmlSource, FileXmlSource>("file1XmlSource", new InjectionConstructor(absoluteFileName));
            this.Container.RegisterType <IReservedAttributeNameProvider, ReservedAttributeNameProvider>(new InjectionConstructor(new List <string>()));

            // IMPORTANT: Must give arrays of object a name in Unity in order for it to resolve them.
            // Register the sitemap node providers
            this.Container.RegisterInstance <ISiteMapNodeProvider>("xmlSiteMapNodeProvider1",
                                                                   this.Container.Resolve <XmlSiteMapNodeProviderFactory>().Create(this.Container.Resolve <IXmlSource>("file1XmlSource")), new ContainerControlledLifetimeManager());
            this.Container.RegisterInstance <ISiteMapNodeProvider>("reflectionSiteMapNodeProvider1",
                                                                   this.Container.Resolve <ReflectionSiteMapNodeProviderFactory>().Create(includeAssembliesForScan), new ContainerControlledLifetimeManager());
            this.Container.RegisterType <ISiteMapNodeProvider, CompositeSiteMapNodeProvider>(new InjectionConstructor(new ResolvedArrayParameter <ISiteMapNodeProvider>(
                                                                                                                          new ResolvedParameter <ISiteMapNodeProvider>("xmlSiteMapNodeProvider1"),
                                                                                                                          new ResolvedParameter <ISiteMapNodeProvider>("reflectionSiteMapNodeProvider1"))));

            // Configure the builders
            this.Container.RegisterType <ISiteMapBuilder, SiteMapBuilder>();

            // Configure the builder sets
            this.Container.RegisterType <ISiteMapBuilderSet, SiteMapBuilderSet>("builderSet1",
                                                                                new InjectionConstructor(
                                                                                    "default",
                                                                                    securityTrimmingEnabled,
                                                                                    enableLocalization,
                                                                                    visibilityAffectsDescendants,
                                                                                    useTitleIfDescriptionNotProvided,
                                                                                    new ResolvedParameter <ISiteMapBuilder>(),
                                                                                    new ResolvedParameter <ICacheDetails>("cacheDetails")));

            this.Container.RegisterType <ISiteMapBuilderSetStrategy, SiteMapBuilderSetStrategy>(new InjectionConstructor(
                                                                                                    new ResolvedArrayParameter <ISiteMapBuilderSet>(new ResolvedParameter <ISiteMapBuilderSet>("builderSet1"))));
        }
Beispiel #5
0
        public MvcSiteMapProviderRegistry()
        {
            bool     securityTrimmingEnabled = false;
            bool     enableLocalization      = true;
            string   absoluteFileName        = HostingEnvironment.MapPath("~/Mvc.sitemap");
            TimeSpan absoluteCacheExpiration = TimeSpan.FromMinutes(5);

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

            var currentAssembly         = this.GetType().Assembly;
            var siteMapProviderAssembly = typeof(SiteMaps).Assembly;
            var allAssemblies           = new Assembly[] { currentAssembly, siteMapProviderAssembly };
            var excludeTypes            = new Type[] {
                typeof(SiteMapNodeVisibilityProviderStrategy),
                typeof(SiteMapXmlReservedAttributeNameProvider),
                typeof(SiteMapBuilderSetStrategy),
                typeof(ControllerTypeResolverFactory)
            };
            var multipleImplementationTypes = new Type[]  {
                typeof(ISiteMapNodeUrlResolver),
                typeof(ISiteMapNodeVisibilityProvider),
                typeof(IDynamicNodeProvider)
            };

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

            // Multiple implementations of strategy based extension points
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => this.For(interfaceType).Singleton().Use(implementationType),
                multipleImplementationTypes,
                allAssemblies,
                excludeTypes,
                "^Composite");

            // Visibility Providers
            this.For <ISiteMapNodeVisibilityProviderStrategy>().Use <SiteMapNodeVisibilityProviderStrategy>()
            .Ctor <string>("defaultProviderName").Is(string.Empty);

            // Pass in the global controllerBuilder reference
            this.For <ControllerBuilder>()
            .Use(x => ControllerBuilder.Current);

            this.For <IControllerBuilder>()
            .Use <ControllerBuilderAdaptor>();

            this.For <IBuildManager>()
            .Use <BuildManagerAdaptor>();

            this.For <IControllerTypeResolverFactory>().Use <ControllerTypeResolverFactory>()
            .Ctor <string[]>("areaNamespacesToIgnore").Is(new string[0]);

            // Configure Security
            this.For <IAclModule>().Use <CompositeAclModule>()
            .EnumerableOf <IAclModule>().Contains(x =>
            {
                x.Type <AuthorizeAttributeAclModule>();
                x.Type <XmlRolesAclModule>();
            });

            // Setup cache
            SmartInstance <CacheDetails> cacheDetails;

#if NET35
            this.For(typeof(ICacheProvider <>)).Use(typeof(AspNetCacheProvider <>));

            var cacheDependency =
                this.For <ICacheDependency>().Use <AspNetFileCacheDependency>()
                .Ctor <string>("fileName").Is(absoluteFileName);

            cacheDetails =
                this.For <ICacheDetails>().Use <CacheDetails>()
                .Ctor <TimeSpan>("absoluteCacheExpiration").Is(absoluteCacheExpiration)
                .Ctor <TimeSpan>("slidingCacheExpiration").Is(TimeSpan.MinValue)
                .Ctor <ICacheDependency>().Is(cacheDependency);
#else
            this.For <System.Runtime.Caching.ObjectCache>()
            .Use(s => System.Runtime.Caching.MemoryCache.Default);

            this.For(typeof(ICacheProvider <>)).Use(typeof(RuntimeCacheProvider <>));

            var cacheDependency =
                this.For <ICacheDependency>().Use <RuntimeFileCacheDependency>()
                .Ctor <string>("fileName").Is(absoluteFileName);

            cacheDetails =
                this.For <ICacheDetails>().Use <CacheDetails>()
                .Ctor <TimeSpan>("absoluteCacheExpiration").Is(absoluteCacheExpiration)
                .Ctor <TimeSpan>("slidingCacheExpiration").Is(TimeSpan.MinValue)
                .Ctor <ICacheDependency>().Is(cacheDependency);
#endif
            // Configure the visitors
            this.For <ISiteMapNodeVisitor>()
            .Use <UrlResolvingSiteMapNodeVisitor>();


            // Register the sitemap builder
            var xmlSource = this.For <IXmlSource>().Use <FileXmlSource>()
                            .Ctor <string>("fileName").Is(absoluteFileName);

            var reservedAttributeNameProvider = this.For <ISiteMapXmlReservedAttributeNameProvider>()
                                                .Use <SiteMapXmlReservedAttributeNameProvider>()
                                                .Ctor <IEnumerable <string> >("attributesToIgnore").Is(new string[0]);

            var builder = this.For <ISiteMapBuilder>().Use <CompositeSiteMapBuilder>()
                          .EnumerableOf <ISiteMapBuilder>().Contains(y =>
            {
                y.Type <XmlSiteMapBuilder>()
                .Ctor <ISiteMapXmlReservedAttributeNameProvider>().Is(reservedAttributeNameProvider)
                .Ctor <IXmlSource>().Is(xmlSource);
                y.Type <ReflectionSiteMapBuilder>()
                .Ctor <IEnumerable <string> >("includeAssemblies").Is(includeAssembliesForScan)
                .Ctor <IEnumerable <string> >("excludeAssemblies").Is(new string[0]);
                y.Type <VisitingSiteMapBuilder>();
            });


            // Configure the builder sets
            this.For <ISiteMapBuilderSetStrategy>().Use <SiteMapBuilderSetStrategy>()
            .EnumerableOf <ISiteMapBuilderSet>().Contains(x =>
            {
                x.Type <SiteMapBuilderSet>()
                .Ctor <string>("instanceName").Is("default")
                .Ctor <bool>("securityTrimmingEnabled").Is(securityTrimmingEnabled)
                .Ctor <bool>("enableLocalization").Is(enableLocalization)
                .Ctor <ISiteMapBuilder>().Is(builder)
                .Ctor <ICacheDetails>().Is(cacheDetails);
            });
        }
        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);
        }
        public void Configure(IExportRegistrationBlock container)
        {
            bool     enableLocalization               = true;
            string   absoluteFileName                 = HostingEnvironment.MapPath("~/Mvc.sitemap");
            TimeSpan absoluteCacheExpiration          = TimeSpan.FromMinutes(5);
            TimeSpan slidingCacheExpiration           = TimeSpan.MinValue;
            bool     includeRootNode                  = true;
            bool     useNestedDynamicNodeRecursion    = false;
            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

            var currentAssembly         = this.GetType().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)
                typeof(SiteMapNodeUrlResolver)
            };

            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.Export(implementationType).As(interfaceType).AndSingleton(),
                new Assembly[] { siteMapProviderAssembly },
                allAssemblies,
                excludeTypes,
                string.Empty);

            // Multiple implementations of strategy based extension points (and not decorated with [ExcludeFromAutoRegistrationAttribute]).
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => container.Export(implementationType).As(interfaceType).AndSingleton(),
                multipleImplementationTypes,
                allAssemblies,
                new Type[0],
                string.Empty);

            // Registration of internal controllers
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => container.Export(implementationType).As(interfaceType).ExternallyOwned(),
                new Type[] { typeof(IController) },
                new Assembly[] { siteMapProviderAssembly },
                new Type[0],
                string.Empty);

            // Visibility Providers
            container.Export <SiteMapNodeVisibilityProviderStrategy>()
            .As <ISiteMapNodeVisibilityProviderStrategy>()
            .WithCtorParam(() => string.Empty).Named("defaultProviderName");

            // Pass in the global controllerBuilder reference
            container.ExportInstance((scope, context) => ControllerBuilder.Current);

            container.Export <ControllerTypeResolverFactory>().As <IControllerTypeResolverFactory>()
            .WithCtorParam(() => new string[0]).Named("areaNamespacesToIgnore");

            // Configure Security
            string attributeModuleKey = typeof(AuthorizeAttributeAclModule).Name;
            container.Export <AuthorizeAttributeAclModule>()
            .As <IAclModule>()
            .WithKey(attributeModuleKey);

            string xmlModuleKey = typeof(XmlRolesAclModule).Name;
            container.Export <XmlRolesAclModule>()
            .As <IAclModule>()
            .WithKey(xmlModuleKey);

            container.Export <CompositeAclModule>()
            .As <IAclModule>()
            .WithCtorParam <IAclModule[]>().Named("aclModules").LocateWithKey(new[] { attributeModuleKey, xmlModuleKey });

            // Configure cache
            container.ExportInstance <System.Runtime.Caching.ObjectCache>(
                (scope, context) => System.Runtime.Caching.MemoryCache.Default);

            container.Export(typeof(RuntimeCacheProvider <>)).As(typeof(ICacheProvider <>));

            container.Export <RuntimeFileCacheDependency>()
            .As <ICacheDependency>()
            .WithKey("cacheDependency1")
            .WithCtorParam(() => absoluteFileName).Named("fileName");

            container.Export <CacheDetails>()
            .As <ICacheDetails>()
            .WithKey("cacheDetails1")
            .WithCtorParam <ICacheDependency>().LocateWithKey("cacheDependency1")
            .WithNamedCtorValue(() => absoluteCacheExpiration)
            .WithNamedCtorValue(() => slidingCacheExpiration);

            // Configure the visitors
            container.Export <UrlResolvingSiteMapNodeVisitor>().As <ISiteMapNodeVisitor>();

            // Prepare for our node providers
            container.Export <FileXmlSource>()
            .As <IXmlSource>()
            .WithKey("xmlSource1")
            .WithCtorParam(() => absoluteFileName);

            container.Export <ReservedAttributeNameProvider>().As <IReservedAttributeNameProvider>()
            .WithCtorParam(() => new string[0]).Named("attributesToIgnore");

            // Register the sitemap node providers
            container.Export <XmlSiteMapNodeProvider>()
            .As <ISiteMapNodeProvider>()
            .WithKey("xmlSiteMapNodeProvider1")
            .WithCtorParam <IXmlSource>().LocateWithKey("xmlSource1")
            .WithNamedCtorValue(() => includeRootNode)
            .WithNamedCtorValue(() => useNestedDynamicNodeRecursion);

            container.Export <ReflectionSiteMapNodeProvider>()
            .As <ISiteMapNodeProvider>()
            .WithKey("reflectionSiteMapNodeProvider1")
            .WithCtorParam(() => includeAssembliesForScan).Named("includeAssemblies")
            .WithCtorParam(() => new string[0]).Named("excludeAssemblies");

            container.Export <CompositeSiteMapNodeProvider>()
            .As <ISiteMapNodeProvider>()
            .WithKey("siteMapNodeProvider1")
            .WithCtorParam <ISiteMapNodeProvider[]>().LocateWithKey(new[]
            {
                "xmlSiteMapNodeProvider1",
                "reflectionSiteMapNodeProvider1"
            });

            // Register the sitemap builders
            container.Export <SiteMapBuilder>()
            .As <ISiteMapBuilder>()
            .WithKey("siteMapBuilder1")
            .WithCtorParam <ISiteMapNodeProvider>().Named("siteMapNodeProvider").LocateWithKey("siteMapNodeProvider1");

            // Configure the builder sets
            container.Export <SiteMapBuilderSet>()
            .As <ISiteMapBuilderSet>()
            .WithKey("builderSet1")
            .WithCtorParam(() => "default").Named("instanceName")
            .WithCtorParam <ISiteMapBuilder>().Named("siteMapBuilder").LocateWithKey("siteMapBuilder1")
            .WithCtorParam <ICacheDetails>().Named("cacheDetails").LocateWithKey("cacheDetails1")
            .WithNamedCtorValue(() => securityTrimmingEnabled)
            .WithNamedCtorValue(() => enableLocalization)
            .WithNamedCtorValue(() => visibilityAffectsDescendants)
            .WithNamedCtorValue(() => useTitleIfDescriptionNotProvided);

            container.Export <SiteMapBuilderSetStrategy>()
            .As <ISiteMapBuilderSetStrategy>()
            .WithCtorParam <ISiteMapBuilderSet[]>().Named("siteMapBuilderSets").LocateWithKey(new[] { "builderSet1" });
        }
        protected override void Load(ContainerBuilder builder)
        {
            bool     enableLocalization               = true;
            string   absoluteFileName                 = HostingEnvironment.MapPath("~/Mvc.sitemap");
            TimeSpan absoluteCacheExpiration          = TimeSpan.FromMinutes(5);
            bool     visibilityAffectsDescendants     = true;
            bool     useTitleIfDescriptionNotProvided = true;



            bool securityTrimmingEnabled = false;

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


            var currentAssembly             = this.GetType().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) => builder.RegisterType(implementationType).As(interfaceType).SingleInstance(),
                new Assembly[] { siteMapProviderAssembly },
                allAssemblies,
                excludeTypes,
                string.Empty);

// Multiple implementations of strategy based extension points (and not decorated with [ExcludeFromAutoRegistrationAttribute]).
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => builder.RegisterType(implementationType).As(interfaceType).SingleInstance(),
                multipleImplementationTypes,
                allAssemblies,
                excludeTypes,
                string.Empty);

// Registration of internal controllers
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => builder.RegisterType(implementationType).As(interfaceType).AsSelf().InstancePerDependency(),
                new Type[] { typeof(IController) },
                new Assembly[] { siteMapProviderAssembly },
                new Type[0],
                string.Empty);

// Visibility Providers
            builder.RegisterType <SiteMapNodeVisibilityProviderStrategy>()
            .As <ISiteMapNodeVisibilityProviderStrategy>()
            .WithParameter("defaultProviderName", string.Empty);

// Pass in the global controllerBuilder reference
            builder.RegisterInstance(ControllerBuilder.Current)
            .As <ControllerBuilder>();

            builder.RegisterType <ControllerTypeResolverFactory>()
            .As <IControllerTypeResolverFactory>()
            .WithParameter("areaNamespacesToIgnore", new string[0]);

// Configure Security
            builder.RegisterType <AuthorizeAttributeAclModule>()
            .Named <IAclModule>("authorizeAttributeAclModule");
            builder.RegisterType <XmlRolesAclModule>()
            .Named <IAclModule>("xmlRolesAclModule");
            builder.RegisterType <CompositeAclModule>()
            .As <IAclModule>()
            .WithParameter(
                (p, c) => p.Name == "aclModules",
                (p, c) => new[]
            {
                c.ResolveNamed <IAclModule>("authorizeAttributeAclModule"),
                c.ResolveNamed <IAclModule>("xmlRolesAclModule")
            });



            builder.RegisterInstance(System.Runtime.Caching.MemoryCache.Default)
            .As <System.Runtime.Caching.ObjectCache>();

            builder.RegisterGeneric(typeof(RuntimeCacheProvider <>))
            .As(typeof(ICacheProvider <>));

            builder.RegisterType <RuntimeFileCacheDependency>()
            .Named <ICacheDependency>("cacheDependency1")
            .WithParameter("fileName", absoluteFileName);

            builder.RegisterType <CacheDetails>()
            .Named <ICacheDetails>("cacheDetails1")
            .WithParameter("absoluteCacheExpiration", absoluteCacheExpiration)
            .WithParameter("slidingCacheExpiration", TimeSpan.MinValue)
            .WithParameter(
                (p, c) => p.Name == "cacheDependency",
                (p, c) => c.ResolveNamed <ICacheDependency>("cacheDependency1"));

// Configure the visitors
            builder.RegisterType <UrlResolvingSiteMapNodeVisitor>()
            .As <ISiteMapNodeVisitor>();

// Prepare for our node providers
            builder.RegisterType <FileXmlSource>()
            .Named <IXmlSource>("xmlSource1")
            .WithParameter("fileName", absoluteFileName);

            builder.RegisterType <ReservedAttributeNameProvider>()
            .As <IReservedAttributeNameProvider>()
            .WithParameter("attributesToIgnore", new string[0]);


// Register the sitemap node providers
            builder.RegisterType <XmlSiteMapNodeProvider>()
            .Named <ISiteMapNodeProvider>("xmlSiteMapNodeProvider1")
            .WithParameter("includeRootNode", true)
            .WithParameter("useNestedDynamicNodeRecursion", false)
            .WithParameter(
                (p, c) => p.Name == "xmlSource",
                (p, c) => c.ResolveNamed <IXmlSource>("xmlSource1"));

            builder.RegisterType <ReflectionSiteMapNodeProvider>()
            .Named <ISiteMapNodeProvider>("reflectionSiteMapNodeProvider1")
            .WithParameter("includeAssemblies", includeAssembliesForScan)
            .WithParameter("excludeAssemblies", new string[0]);

            builder.RegisterType <CompositeSiteMapNodeProvider>()
            .Named <ISiteMapNodeProvider>("siteMapNodeProvider1")
            .WithParameter(
                (p, c) => p.Name == "siteMapNodeProviders",
                (p, c) => new[]
            {
                c.ResolveNamed <ISiteMapNodeProvider>("xmlSiteMapNodeProvider1"),
                c.ResolveNamed <ISiteMapNodeProvider>("reflectionSiteMapNodeProvider1")
            });

// Register the sitemap builders
            builder.RegisterType <SiteMapBuilder>()
            .Named <ISiteMapBuilder>("siteMapBuilder1")
            .WithParameter(
                (p, c) => p.Name == "siteMapNodeProvider",
                (p, c) => c.ResolveNamed <ISiteMapNodeProvider>("siteMapNodeProvider1"));

// Configure the builder sets
            builder.RegisterType <SiteMapBuilderSet>()
            .Named <ISiteMapBuilderSet>("builderSet1")
            .WithParameter("instanceName", "default")
            .WithParameter("securityTrimmingEnabled", securityTrimmingEnabled)
            .WithParameter("enableLocalization", enableLocalization)
            .WithParameter("visibilityAffectsDescendants", visibilityAffectsDescendants)
            .WithParameter("useTitleIfDescriptionNotProvided", useTitleIfDescriptionNotProvided)
            .WithParameter(
                (p, c) => p.Name == "siteMapBuilder",
                (p, c) => c.ResolveNamed <ISiteMapBuilder>("siteMapBuilder1"))
            .WithParameter(
                (p, c) => p.Name == "cacheDetails",
                (p, c) => c.ResolveNamed <ICacheDetails>("cacheDetails1"));

            builder.RegisterType <SiteMapBuilderSetStrategy>()
            .As <ISiteMapBuilderSetStrategy>()
            .WithParameter(
                (p, c) => p.Name == "siteMapBuilderSets",
                (p, c) => c.ResolveNamed <IEnumerable <ISiteMapBuilderSet> >("builderSet1"));
        }
        public void StripBasicParametersRemovesCarrotedStrings()
        {
            var actual = CommonConventions.StripBasicParameters("abc <1234> def");

            Assert.AreEqual("abc  def", actual);
        }
        public void StripBasicParametersRemovesDoubleQuotedStrings()
        {
            var actual = CommonConventions.StripBasicParameters("abc \"1234\" def");

            Assert.AreEqual("abc  def", actual);
        }
        public void StripBasicParametersRemovesDecimals()
        {
            var actual = CommonConventions.StripBasicParameters("abc 12.34 def");

            Assert.AreEqual("abc  def", actual);
        }
Beispiel #12
0
    protected override void Initialize()
    {
        bool securityTrimmingEnabled = false;
        bool enableLocalization      = true;

        string rootSiteMapFile  = HostingEnvironment.MapPath("~/Mvc.sitemap");
        string adminSiteMapFile = HostingEnvironment.MapPath("~/Areas/Admin/Mvc.sitemap");

        TimeSpan absoluteCacheExpiration = TimeSpan.FromMinutes(5);

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

        var currentAssembly         = this.GetType().Assembly;
        var siteMapProviderAssembly = typeof(SiteMaps).Assembly;
        var allAssemblies           = new Assembly[] { currentAssembly, siteMapProviderAssembly };
        var excludeTypes            = new Type[] {
            typeof(SiteMapNodeVisibilityProviderStrategy),
            typeof(SiteMapXmlReservedAttributeNameProvider),
            typeof(SiteMapBuilderSetStrategy),
            typeof(SiteMapNodeUrlResolverStrategy),
            typeof(DynamicNodeProviderStrategy)
        };
        var multipleImplementationTypes = new Type[] {
            typeof(ISiteMapNodeUrlResolver),
            typeof(ISiteMapNodeVisibilityProvider),
            typeof(IDynamicNodeProvider)
        };

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

        // Multiple implementations of strategy based extension points
        CommonConventions.RegisterAllImplementationsOfInterface(
            (interfaceType, implementationType) => this.Container.RegisterType(interfaceType, implementationType, implementationType.Name, new ContainerControlledLifetimeManager()),
            multipleImplementationTypes,
            allAssemblies,
            excludeTypes,
            "^Composite");

        // TODO: Find a better way to inject an array constructor

        // Url Resolvers
        this.Container.RegisterType <ISiteMapNodeUrlResolverStrategy, SiteMapNodeUrlResolverStrategy>(new InjectionConstructor(
                                                                                                          new ResolvedArrayParameter <ISiteMapNodeUrlResolver>(this.Container.ResolveAll <ISiteMapNodeUrlResolver>().ToArray())
                                                                                                          ));

        // Visibility Providers
        this.Container.RegisterType <ISiteMapNodeVisibilityProviderStrategy, SiteMapNodeVisibilityProviderStrategy>(new InjectionConstructor(
                                                                                                                        new ResolvedArrayParameter <ISiteMapNodeVisibilityProvider>(this.Container.ResolveAll <ISiteMapNodeVisibilityProvider>().ToArray()),
                                                                                                                        new InjectionParameter <string>(string.Empty)
                                                                                                                        ));

        // Dynamic Node Providers
        this.Container.RegisterType <IDynamicNodeProviderStrategy, DynamicNodeProviderStrategy>(new InjectionConstructor(
                                                                                                    new ResolvedArrayParameter <IDynamicNodeProvider>(this.Container.ResolveAll <IDynamicNodeProvider>().ToArray())
                                                                                                    ));


        // Pass in the global controllerBuilder reference
        this.Container.RegisterInstance <ControllerBuilder>(ControllerBuilder.Current);
        this.Container.RegisterType <IControllerBuilder, ControllerBuilderAdaptor>(new PerResolveLifetimeManager());

        this.Container.RegisterType <IBuildManager, BuildManagerAdaptor>(new PerResolveLifetimeManager());

        this.Container.RegisterType <IControllerTypeResolverFactory, ControllerTypeResolverFactory>(new InjectionConstructor(
                                                                                                        new List <string>(),
                                                                                                        new ResolvedParameter <IControllerBuilder>(),
                                                                                                        new ResolvedParameter <IBuildManager>()));

        // Configure Security

        // IMPORTANT: Must give arrays of object a name in Unity in order for it to resolve them.
        // Register the sitemap node providers
        this.Container.RegisterInstance <ISiteMapNodeProvider>("rootXmlSiteMapNodeProvider",
                                                               this.Container.Resolve <XmlSiteMapNodeProviderFactory>().Create(this.Container.Resolve <IXmlSource>("rootSiteMapXmlSource")), new ContainerControlledLifetimeManager());

        this.Container.RegisterInstance <ISiteMapNodeProvider>("adminXmlSiteMapNodeProvider",
                                                               this.Container.Resolve <XmlSiteMapNodeProviderFactory>().Create(this.Container.Resolve <IXmlSource>("adminSiteMapXmlSource")), new ContainerControlledLifetimeManager());

        this.Container.RegisterInstance <ISiteMapNodeProvider>("ReflectionSiteMapNodeProvider1",
                                                               this.Container.Resolve <ReflectionSiteMapNodeProviderFactory>().Create(includeAssembliesForScan), new ContainerControlledLifetimeManager());
        this.Container.RegisterType <ISiteMapNodeProvider, CompositeSiteMapNodeProvider>(new InjectionConstructor(new ResolvedArrayParameter <ISiteMapNodeProvider>(
                                                                                                                      new ResolvedParameter <ISiteMapNodeProvider>("rootXmlSiteMapNodeProvider"),
                                                                                                                      new ResolvedParameter <ISiteMapNodeProvider>("adminXmlSiteMapNodeProvider"),
                                                                                                                      new ResolvedParameter <ISiteMapNodeProvider>("ReflectionSiteMapNodeProvider1"))));

        // Configure the builders
        this.Container.RegisterType <ISiteMapBuilder, SiteMapBuilder>();

        // Configure the builder sets
        this.Container.RegisterType <ISiteMapBuilderSet, SiteMapBuilderSet>("rootBuilderSet",
                                                                            new InjectionConstructor(
                                                                                "default",
                                                                                securityTrimmingEnabled,
                                                                                enableLocalization,
                                                                                new ResolvedParameter <ISiteMapBuilder>(), // You are sharing the same builder instance here
                                                                                new ResolvedParameter <ICacheDetails>("rootSiteMapCacheDetails")));

        this.Container.RegisterType <ISiteMapBuilderSet, SiteMapBuilderSet>("adminBuilderSet",
                                                                            new InjectionConstructor(
                                                                                "admin",
                                                                                securityTrimmingEnabled,
                                                                                enableLocalization,
                                                                                new ResolvedParameter <ISiteMapBuilder>(), // You are sharing the same builder instance here
                                                                                new ResolvedParameter <ICacheDetails>("adminSiteMapCacheDetails")));


        Instead of the above, it should be something like...

        // IMPORTANT: Must give arrays of object a name in Unity in order for it to resolve them.
        // Register the sitemap node providers
        this.Container.RegisterInstance <ISiteMapNodeProvider>("rootXmlSiteMapNodeProvider",
                                                               this.Container.Resolve <XmlSiteMapNodeProviderFactory>().Create(this.Container.Resolve <IXmlSource>("rootSiteMapXmlSource")), new ContainerControlledLifetimeManager());

        this.Container.RegisterInstance <ISiteMapNodeProvider>("adminXmlSiteMapNodeProvider",
                                                               this.Container.Resolve <XmlSiteMapNodeProviderFactory>().Create(this.Container.Resolve <IXmlSource>("adminSiteMapXmlSource")), new ContainerControlledLifetimeManager());

        this.Container.RegisterInstance <ISiteMapNodeProvider>("ReflectionSiteMapNodeProvider1",
                                                               this.Container.Resolve <ReflectionSiteMapNodeProviderFactory>().Create(includeAssembliesForScan), new ContainerControlledLifetimeManager());

        this.Container.RegisterType <ISiteMapNodeProvider, CompositeSiteMapNodeProvider>("rootSiteMapNodeProvider",
                                                                                         new ContainerControlledLifetimeManager(),
                                                                                         new InjectionConstructor(new ResolvedArrayParameter <ISiteMapNodeProvider>(
                                                                                                                      new ResolvedParameter <ISiteMapNodeProvider>("rootXmlSiteMapNodeProvider"),
                                                                                                                      new ResolvedParameter <ISiteMapNodeProvider>("ReflectionSiteMapNodeProvider1"))));

        this.Container.RegisterType <ISiteMapNodeProvider, CompositeSiteMapNodeProvider>("adminSiteMapNodeProvider",
                                                                                         new ContainerControlledLifetimeManager(),
                                                                                         new InjectionConstructor(new ResolvedArrayParameter <ISiteMapNodeProvider>(
                                                                                                                      new ResolvedParameter <ISiteMapNodeProvider>("adminXmlSiteMapNodeProvider"),
                                                                                                                      new ResolvedParameter <ISiteMapNodeProvider>("ReflectionSiteMapNodeProvider1"))));

        // Configure the builders
        this.Container.RegisterInstance <ISiteMapBuilder>("rootSiteMapBuilder",
                                                          this.Container.Resolve <SiteMapBuilderFactory>().Create(this.Container.Resolve <ISiteMapNodeProvider>("rootSiteMapNodeProvider")),
                                                          new ContainerControlledLifetimeManager());

        this.Container.RegisterInstance <ISiteMapBuilder>("adminSiteMapBuilder",
                                                          this.Container.Resolve <SiteMapBuilderFactory>().Create(this.Container.Resolve <ISiteMapNodeProvider>("adminSiteMapNodeProvider")),
                                                          new ContainerControlledLifetimeManager());

        // Configure the builder sets
        this.Container.RegisterType <ISiteMapBuilderSet, SiteMapBuilderSet>("rootBuilderSet",
                                                                            new InjectionConstructor(
                                                                                "default",
                                                                                securityTrimmingEnabled,
                                                                                enableLocalization,
                                                                                new ResolvedParameter <ISiteMapBuilder>("rootSiteMapBuilder"),
                                                                                new ResolvedParameter <ICacheDetails>("rootSiteMapCacheDetails")));

        this.Container.RegisterType <ISiteMapBuilderSet, SiteMapBuilderSet>("adminBuilderSet",
                                                                            new InjectionConstructor(
                                                                                "admin",
                                                                                securityTrimmingEnabled,
                                                                                enableLocalization,
                                                                                new ResolvedParameter <ISiteMapBuilder>("adminSiteMapBuilder"),
                                                                                new ResolvedParameter <ICacheDetails>("adminSiteMapCacheDetails")));
    }
        protected override void Initialize()
        {
            const bool enableLocalization               = true;
            string     absoluteFileName                 = HostingEnvironment.MapPath("~/Store.sitemap");
            TimeSpan   absoluteCacheExpiration          = TimeSpan.FromMinutes(5);
            const bool visibilityAffectsDescendants     = true;
            const bool useTitleIfDescriptionNotProvided = true;

            const bool securityTrimmingEnabled  = false;
            var        includeAssembliesForScan = new[] { "VirtoCommerce.Web" };

            var currentAssembly         = GetType().Assembly;
            var siteMapProviderAssembly = typeof(SiteMaps).Assembly;
            var clientAssembly          = typeof(NamedSiteMapNodeVisibilityProvider).Assembly;
            var allAssemblies           = new[] { currentAssembly, siteMapProviderAssembly, clientAssembly };
            var excludeTypes            = new[] {
                typeof(IRouteValueDictionaryFactory),
                typeof(ISiteMapCacheKeyGenerator),
            };
            var multipleImplementationTypes = new[] {
                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.RegisterType(interfaceType, implementationType, new ContainerControlledLifetimeManager()),
                new[] { siteMapProviderAssembly },
                allAssemblies,
                excludeTypes,
                string.Empty);

// Multiple implementations of strategy based extension points (and not decorated with [ExcludeFromAutoRegistrationAttribute]).
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => Container.RegisterType(interfaceType, implementationType, implementationType.Name, new ContainerControlledLifetimeManager()),
                multipleImplementationTypes,
                allAssemblies,
                excludeTypes,
                string.Empty);

// TODO: Find a better way to inject an array constructor

//Register custom route value dictionary factory
            Container.RegisterType <IRouteValueDictionaryFactory, SeoRouteValueDictionaryFactory>(new InjectionConstructor(
                                                                                                      new ResolvedParameter <IRequestCache>(),
                                                                                                      new ResolvedParameter <IReservedAttributeNameProvider>(),
                                                                                                      new ResolvedParameter <IJsonToDictionaryDeserializer>()));

//Register custom sitemap cache key generator
            Container.RegisterType <ISiteMapCacheKeyGenerator, SiteMapStoreCacheKeyGenerator>(new InjectionConstructor(
                                                                                                  new ResolvedParameter <IMvcContextFactory>()));

// Url Resolvers
            Container.RegisterType <ISiteMapNodeUrlResolverStrategy, SiteMapNodeUrlResolverStrategy>(new InjectionConstructor(
                                                                                                         new ResolvedArrayParameter <ISiteMapNodeUrlResolver>(Container.ResolveAll <ISiteMapNodeUrlResolver>().ToArray())
                                                                                                         ));

// Visibility Providers
            Container.RegisterType <ISiteMapNodeVisibilityProviderStrategy, SiteMapNodeVisibilityProviderStrategy>(new InjectionConstructor(
                                                                                                                       new ResolvedArrayParameter <ISiteMapNodeVisibilityProvider>(Container.ResolveAll <ISiteMapNodeVisibilityProvider>().ToArray()),
                                                                                                                       new InjectionParameter <string>(typeof(NamedSiteMapNodeVisibilityProvider).ShortAssemblyQualifiedName())
                                                                                                                       ));

// Dynamic Node Providers
            Container.RegisterType <IDynamicNodeProviderStrategy, DynamicNodeProviderStrategy>(new InjectionConstructor(
                                                                                                   new ResolvedArrayParameter <IDynamicNodeProvider>(Container.ResolveAll <IDynamicNodeProvider>().ToArray())
                                                                                                   ));


// Pass in the global controllerBuilder reference
            Container.RegisterInstance <ControllerBuilder>(ControllerBuilder.Current);

            Container.RegisterType <IControllerTypeResolverFactory, ControllerTypeResolverFactory>(new InjectionConstructor(
                                                                                                       new List <string>(),
                                                                                                       new ResolvedParameter <IControllerBuilder>(),
                                                                                                       new ResolvedParameter <IBuildManager>()));

// Configure Security

// IMPORTANT: Must give arrays of object a name in Unity in order for it to resolve them.
            Container.RegisterType <IAclModule, AuthorizeAttributeAclModule>("authorizeAttribute");
            Container.RegisterType <IAclModule, XmlRolesAclModule>("xmlRoles");
            Container.RegisterType <IAclModule, CompositeAclModule>(new InjectionConstructor(new ResolvedArrayParameter <IAclModule>(
                                                                                                 new ResolvedParameter <IAclModule>("authorizeAttribute"),
                                                                                                 new ResolvedParameter <IAclModule>("xmlRoles"))));

            Container.RegisterInstance <ObjectCache>(MemoryCache.Default);
            Container.RegisterType(typeof(ICacheProvider <>), typeof(RuntimeCacheProvider <>));
            Container.RegisterType <ICacheDependency, RuntimeFileCacheDependency>(
                "cacheDependency", new InjectionConstructor(absoluteFileName));

            Container.RegisterType <ICacheDetails, CacheDetails>("cacheDetails",
                                                                 new InjectionConstructor(absoluteCacheExpiration, TimeSpan.MinValue, new ResolvedParameter <ICacheDependency>("cacheDependency")));

// Configure the visitors
            Container.RegisterType <ISiteMapNodeVisitor, UrlResolvingSiteMapNodeVisitor>();

// Prepare for the sitemap node providers
            Container.RegisterType <IXmlSource, FileXmlSource>("file1XmlSource", new InjectionConstructor(absoluteFileName));
            Container.RegisterType <IReservedAttributeNameProvider, ReservedAttributeNameProvider>(new InjectionConstructor(new List <string>()));

// IMPORTANT: Must give arrays of object a name in Unity in order for it to resolve them.
// Register the sitemap node providers
            Container.RegisterInstance <ISiteMapNodeProvider>("xmlSiteMapNodeProvider1",
                                                              Container.Resolve <XmlSiteMapNodeProviderFactory>().Create(Container.Resolve <IXmlSource>("file1XmlSource")), new ContainerControlledLifetimeManager());
            Container.RegisterInstance <ISiteMapNodeProvider>("reflectionSiteMapNodeProvider1",
                                                              Container.Resolve <ReflectionSiteMapNodeProviderFactory>().Create(includeAssembliesForScan), new ContainerControlledLifetimeManager());
            Container.RegisterType <ISiteMapNodeProvider, CompositeSiteMapNodeProvider>(new InjectionConstructor(new ResolvedArrayParameter <ISiteMapNodeProvider>(
                                                                                                                     new ResolvedParameter <ISiteMapNodeProvider>("xmlSiteMapNodeProvider1"),
                                                                                                                     new ResolvedParameter <ISiteMapNodeProvider>("reflectionSiteMapNodeProvider1"))));

// Configure the builders
            Container.RegisterType <ISiteMapBuilder, SiteMapBuilder>();

// Configure the builder sets
            Container.RegisterType <ISiteMapBuilderSet, SiteMapBuilderSet>("builderSet1",
                                                                           new InjectionConstructor(
                                                                               "default",
                                                                               securityTrimmingEnabled,
                                                                               enableLocalization,
                                                                               visibilityAffectsDescendants,
                                                                               useTitleIfDescriptionNotProvided,
                                                                               new ResolvedParameter <ISiteMapBuilder>(),
                                                                               new ResolvedParameter <ICacheDetails>("cacheDetails")));

            Container.RegisterType <ISiteMapBuilderSetStrategy, SiteMapBuilderSetStrategy>(new InjectionConstructor(
                                                                                               new ResolvedArrayParameter <ISiteMapBuilderSet>(new ResolvedParameter <ISiteMapBuilderSet>("builderSet1"))));
        }
        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 override void Load()
        {
            bool     securityTrimmingEnabled = false;
            bool     enableLocalization      = true;
            string   absoluteFileName        = HostingEnvironment.MapPath("~/Mvc.sitemap");
            TimeSpan absoluteCacheExpiration = TimeSpan.FromMinutes(5);

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

            var currentAssembly         = this.GetType().Assembly;
            var siteMapProviderAssembly = typeof(SiteMaps).Assembly;
            var allAssemblies           = new Assembly[] { currentAssembly, siteMapProviderAssembly };
            var excludeTypes            = new Type[] {
                typeof(SiteMapNodeVisibilityProviderStrategy),
                typeof(SiteMapXmlReservedAttributeNameProvider),
                typeof(SiteMapBuilderSetStrategy)
            };
            var multipleImplementationTypes = new Type[]  {
                typeof(ISiteMapNodeUrlResolver),
                typeof(ISiteMapNodeVisibilityProvider),
                typeof(IDynamicNodeProvider)
            };

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

            // Multiple implementations of strategy based extension points
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => this.Kernel.Bind(interfaceType).To(implementationType).InSingletonScope(),
                multipleImplementationTypes,
                allAssemblies,
                excludeTypes,
                "^Composite");

            this.Kernel.Bind <ISiteMapNodeVisibilityProviderStrategy>().To <SiteMapNodeVisibilityProviderStrategy>()
            .WithConstructorArgument("defaultProviderName", string.Empty);

            this.Kernel.Bind <ControllerBuilder>().ToConstant(ControllerBuilder.Current);
            this.Kernel.Bind <IControllerBuilder>().To <ControllerBuilderAdaptor>();
            this.Kernel.Bind <IBuildManager>().To <BuildManagerAdaptor>();

            // Configure Security
            this.Kernel.Bind <AuthorizeAttributeAclModule>().ToSelf();
            this.Kernel.Bind <XmlRolesAclModule>().ToSelf();
            this.Kernel.Bind <IAclModule>().To <CompositeAclModule>()
            .WithConstructorArgument("aclModules",
                                     new IAclModule[] {
                this.Kernel.Get <AuthorizeAttributeAclModule>(),
                this.Kernel.Get <XmlRolesAclModule>()
            });


            // Setup cache
#if NET35
            this.Kernel.Bind(typeof(ICacheProvider <>)).To(typeof(AspNetCacheProvider <>));
            this.Kernel.Bind <ICacheDependency>().To <AspNetFileCacheDependency>().Named("cacheDependency1")
            .WithConstructorArgument("fileName", absoluteFileName);
#else
            this.Kernel.Bind <System.Runtime.Caching.ObjectCache>()
            .ToConstant <System.Runtime.Caching.ObjectCache>(System.Runtime.Caching.MemoryCache.Default);
            this.Kernel.Bind(typeof(ICacheProvider <>)).To(typeof(RuntimeCacheProvider <>));
            this.Kernel.Bind <ICacheDependency>().To <RuntimeFileCacheDependency>().Named("cacheDependency1")
            .WithConstructorArgument("fileName", absoluteFileName);
#endif
            this.Kernel.Bind <ICacheDetails>().To <CacheDetails>().Named("cacheDetails1")
            .WithConstructorArgument("absoluteCacheExpiration", absoluteCacheExpiration)
            .WithConstructorArgument("slidingCacheExpiration", TimeSpan.MinValue)
            .WithConstructorArgument("cacheDependency", this.Kernel.Get <ICacheDependency>("cacheDependency1"));


            // Configure the visitors
            this.Kernel.Bind <ISiteMapNodeVisitor>().To <UrlResolvingSiteMapNodeVisitor>();

            // Prepare for our node providers
            this.Kernel.Bind <IXmlSource>().To <FileXmlSource>().Named("XmlSource1")
            .WithConstructorArgument("fileName", absoluteFileName);
            this.Kernel.Bind <ISiteMapXmlReservedAttributeNameProvider>().To <SiteMapXmlReservedAttributeNameProvider>().Named("xmlBuilderReservedAttributeNameProvider")
            .WithConstructorArgument("attributesToIgnore", new string[0]);

            // Register the sitemap node providers
            this.Kernel.Bind <ISiteMapNodeProvider>().To <XmlSiteMapNodeProvider>().Named("xmlSiteMapNodeProvider1")
            .WithConstructorArgument("includeRootNode", true)
            .WithConstructorArgument("useNestedDynamicNodeRecursion", false)
            .WithConstructorArgument("xmlSource", this.Kernel.Get <IXmlSource>("XmlSource1"));

            this.Kernel.Bind <ISiteMapNodeProvider>().To <ReflectionSiteMapNodeProvider>().Named("reflectionSiteMapNodeProvider1")
            .WithConstructorArgument("includeAssemblies", includeAssembliesForScan)
            .WithConstructorArgument("excludeAssemblies", new string[0]);

            this.Kernel.Bind <ISiteMapNodeProvider>().To <CompositeSiteMapNodeProvider>().Named("siteMapNodeProvider1")
            .WithConstructorArgument("siteMapNodeProviders",
                                     new ISiteMapNodeProvider[] {
                this.Kernel.Get <ISiteMapNodeProvider>("xmlSiteMapNodeProvider1"),
                this.Kernel.Get <ISiteMapNodeProvider>("reflectionSiteMapNodeProvider1")
            });

            // Register the sitemap builders
            this.Kernel.Bind <ISiteMapBuilder>().To <SiteMapBuilder>().Named("siteMapBuilder1")
            .WithConstructorArgument("siteMapNodeProvider", this.Kernel.Get <ISiteMapNodeProvider>("siteMapNodeProvider1"));

            // Configure the builder sets
            this.Kernel.Bind <ISiteMapBuilderSet>().To <SiteMapBuilderSet>().Named("siteMapBuilderSet1")
            .WithConstructorArgument("instanceName", "default")
            .WithConstructorArgument("securityTrimmingEnabled", securityTrimmingEnabled)
            .WithConstructorArgument("enableLocalization", enableLocalization)
            .WithConstructorArgument("siteMapBuilder", this.Kernel.Get <ISiteMapBuilder>("siteMapBuilder1"))
            .WithConstructorArgument("cacheDetails", this.Kernel.Get <ICacheDetails>("cacheDetails1"));

            this.Kernel.Bind <ISiteMapBuilderSetStrategy>().To <SiteMapBuilderSetStrategy>()
            .WithConstructorArgument("siteMapBuilderSets",
                                     new ISiteMapBuilderSet[] {
                this.Kernel.Get <ISiteMapBuilderSet>("siteMapBuilderSet1")
            });
        }
Beispiel #16
0
        protected override void Initialize()
        {
            bool     securityTrimmingEnabled = false;
            bool     enableLocalization      = true;
            string   absoluteFileName        = HostingEnvironment.MapPath("~/Mvc.sitemap");
            TimeSpan absoluteCacheExpiration = TimeSpan.FromMinutes(5);

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

            var currentAssembly         = this.GetType().Assembly;
            var siteMapProviderAssembly = typeof(SiteMaps).Assembly;
            var allAssemblies           = new Assembly[] { currentAssembly, siteMapProviderAssembly };
            var excludeTypes            = new Type[] {
                typeof(SiteMapNodeVisibilityProviderStrategy),
                typeof(SiteMapXmlReservedAttributeNameProvider),
                typeof(SiteMapBuilderSetStrategy),
                typeof(SiteMapNodeUrlResolverStrategy),
                typeof(DynamicNodeProviderStrategy)
            };
            var multipleImplementationTypes = new Type[]  {
                typeof(ISiteMapNodeUrlResolver),
                typeof(ISiteMapNodeVisibilityProvider),
                typeof(IDynamicNodeProvider)
            };

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

            // Multiple implementations of strategy based extension points
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => this.Container.RegisterType(interfaceType, implementationType, implementationType.Name, new ContainerControlledLifetimeManager()),
                multipleImplementationTypes,
                allAssemblies,
                excludeTypes,
                "^Composite");

            // TODO: Find a better way to inject an array constructor

            // Url Resolvers
            this.Container.RegisterType <ISiteMapNodeUrlResolverStrategy, SiteMapNodeUrlResolverStrategy>(new InjectionConstructor(
                                                                                                              new ResolvedArrayParameter <ISiteMapNodeUrlResolver>(this.Container.ResolveAll <ISiteMapNodeUrlResolver>().ToArray())
                                                                                                              ));

            // Visibility Providers
            this.Container.RegisterType <ISiteMapNodeVisibilityProviderStrategy, SiteMapNodeVisibilityProviderStrategy>(new InjectionConstructor(
                                                                                                                            new ResolvedArrayParameter <ISiteMapNodeVisibilityProvider>(this.Container.ResolveAll <ISiteMapNodeVisibilityProvider>().ToArray()),
                                                                                                                            new InjectionParameter <string>(string.Empty)
                                                                                                                            ));

            // Dynamic Node Providers
            this.Container.RegisterType <IDynamicNodeProviderStrategy, DynamicNodeProviderStrategy>(new InjectionConstructor(
                                                                                                        new ResolvedArrayParameter <IDynamicNodeProvider>(this.Container.ResolveAll <IDynamicNodeProvider>().ToArray())
                                                                                                        ));


            // Pass in the global controllerBuilder reference
            this.Container.RegisterInstance <ControllerBuilder>(ControllerBuilder.Current);
            this.Container.RegisterType <IControllerBuilder, ControllerBuilderAdaptor>(new PerResolveLifetimeManager());

            this.Container.RegisterType <IBuildManager, BuildManagerAdaptor>(new PerResolveLifetimeManager());

            this.Container.RegisterType <IControllerTypeResolverFactory, ControllerTypeResolverFactory>(new InjectionConstructor(
                                                                                                            new List <string>(),
                                                                                                            new ResolvedParameter <IControllerBuilder>(),
                                                                                                            new ResolvedParameter <IBuildManager>()));

            // Configure Security

            // IMPORTANT: Must give arrays of object a name in Unity in order for it to resolve them.
            this.Container.RegisterType <IAclModule, AuthorizeAttributeAclModule>("authorizeAttribute");
            this.Container.RegisterType <IAclModule, XmlRolesAclModule>("xmlRoles");
            this.Container.RegisterType <IAclModule, CompositeAclModule>(new InjectionConstructor(new ResolvedArrayParameter <IAclModule>(
                                                                                                      new ResolvedParameter <IAclModule>("authorizeAttribute"),
                                                                                                      new ResolvedParameter <IAclModule>("xmlRoles"))));

#if NET35
            this.Container.RegisterType(typeof(ICacheProvider <>), typeof(AspNetCacheProvider <>));
            this.Container.RegisterType <ICacheDependency, AspNetFileCacheDependency>(
                "cacheDependency", new InjectionConstructor(absoluteFileName));
#else
            this.Container.RegisterInstance <System.Runtime.Caching.ObjectCache>(System.Runtime.Caching.MemoryCache.Default);
            this.Container.RegisterType(typeof(ICacheProvider <>), typeof(RuntimeCacheProvider <>));
            this.Container.RegisterType <ICacheDependency, RuntimeFileCacheDependency>(
                "cacheDependency", new InjectionConstructor(absoluteFileName));
#endif
            this.Container.RegisterType <ICacheDetails, CacheDetails>("cacheDetails",
                                                                      new InjectionConstructor(absoluteCacheExpiration, TimeSpan.MinValue, new ResolvedParameter <ICacheDependency>("cacheDependency")));

            // Configure the visitors
            this.Container.RegisterType <ISiteMapNodeVisitor, UrlResolvingSiteMapNodeVisitor>();

            // Prepare for the sitemap node providers
            this.Container.RegisterType <IXmlSource, FileXmlSource>("file1XmlSource", new InjectionConstructor(absoluteFileName));
            this.Container.RegisterType <ISiteMapXmlReservedAttributeNameProvider, SiteMapXmlReservedAttributeNameProvider>(new InjectionConstructor(new List <string>()));

            // IMPORTANT: Must give arrays of object a name in Unity in order for it to resolve them.
            // Register the sitemap node providers
            this.Container.RegisterInstance <ISiteMapNodeProvider>("xmlSiteMapNodeProvider1",
                                                                   this.Container.Resolve <XmlSiteMapNodeProviderFactory>().Create(this.Container.Resolve <IXmlSource>("file1XmlSource")), new ContainerControlledLifetimeManager());
            this.Container.RegisterInstance <ISiteMapNodeProvider>("ReflectionSiteMapNodeProvider1",
                                                                   this.Container.Resolve <ReflectionSiteMapNodeProviderFactory>().Create(includeAssembliesForScan), new ContainerControlledLifetimeManager());
            this.Container.RegisterType <ISiteMapNodeProvider, CompositeSiteMapNodeProvider>(new InjectionConstructor(new ResolvedArrayParameter <ISiteMapNodeProvider>(
                                                                                                                          new ResolvedParameter <ISiteMapNodeProvider>("xmlSiteMapNodeProvider1"),
                                                                                                                          new ResolvedParameter <ISiteMapNodeProvider>("ReflectionSiteMapNodeProvider1"))));

            // Configure the builders
            this.Container.RegisterType <ISiteMapBuilder, SiteMapBuilder>();

            // Configure the builder sets
            this.Container.RegisterType <ISiteMapBuilderSet, SiteMapBuilderSet>("builderSet1",
                                                                                new InjectionConstructor(
                                                                                    "default",
                                                                                    securityTrimmingEnabled,
                                                                                    enableLocalization,
                                                                                    new ResolvedParameter <ISiteMapBuilder>(),
                                                                                    new ResolvedParameter <ICacheDetails>("cacheDetails")));

            this.Container.RegisterType <ISiteMapBuilderSetStrategy, SiteMapBuilderSetStrategy>(new InjectionConstructor(new ResolvedArrayParameter <ISiteMapBuilderSet>(new ResolvedParameter <ISiteMapBuilderSet>("builderSet1"))));
        }
        public void TitlizeWordsDoesTheThing()
        {
            var actual = CommonConventions.TitlizeWords("the quick brown fox");

            Assert.AreEqual("The Quick Brown Fox", actual);
        }
Beispiel #18
0
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            bool     securityTrimmingEnabled = false;
            bool     enableLocalization      = true;
            string   absoluteFileName        = HostingEnvironment.MapPath("~/Mvc.sitemap");
            TimeSpan absoluteCacheExpiration = TimeSpan.FromMinutes(5);

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

            // Configure Windsor to resolve arrays in constructors
            container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel, true));

            var currentAssembly         = this.GetType().Assembly;
            var siteMapProviderAssembly = typeof(SiteMaps).Assembly;
            var allAssemblies           = new Assembly[] { currentAssembly, siteMapProviderAssembly };
            var excludeTypes            = new Type[] {
                typeof(SiteMapNodeVisibilityProviderStrategy),
                typeof(SiteMapXmlReservedAttributeNameProvider),
                typeof(SiteMapBuilderSetStrategy),
                typeof(ControllerTypeResolverFactory),
                typeof(SiteMapNodeUrlResolver)
            };
            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.Register(Component.For(interfaceType).ImplementedBy(implementationType).LifestyleSingleton()),
                new Assembly[] { siteMapProviderAssembly },
                allAssemblies,
                excludeTypes,
                string.Empty);

            // Multiple implementations of strategy based extension points
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => container.Register(Component.For(interfaceType).ImplementedBy(implementationType).LifestyleSingleton()),
                multipleImplementationTypes,
                allAssemblies,
                new Type[0],
                "^Composite");

            // Registration of internal controllers
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => container.Register(Component.For(implementationType).ImplementedBy(implementationType).LifestyleTransient()),
                new Type[] { typeof(IController) },
                new Assembly[] { siteMapProviderAssembly },
                new Type[0],
                string.Empty);

            // Visibility Providers
            container.Register(Component.For <ISiteMapNodeVisibilityProviderStrategy>().ImplementedBy <SiteMapNodeVisibilityProviderStrategy>()
                               .DependsOn(Dependency.OnValue("defaultProviderName", string.Empty)));

            // Pass in the global controllerBuilder reference
            container.Register(Component.For <ControllerBuilder>().Instance(ControllerBuilder.Current));
            container.Register(Component.For <IControllerBuilder>().ImplementedBy <ControllerBuilderAdaptor>());
            container.Register(Component.For <IBuildManager>().ImplementedBy <BuildManagerAdaptor>());
            container.Register(Component.For <IControllerTypeResolverFactory>().ImplementedBy <ControllerTypeResolverFactory>()
                               .DependsOn(Dependency.OnValue("areaNamespacesToIgnore", new string[0])));

            // Configure Security

            // First registration wins - we must do the outer one first
            container.Register(Component.For <IAclModule>().ImplementedBy <CompositeAclModule>()
                               .DependsOn(Dependency.OnComponentCollection <IEnumerable <IAclModule> >(typeof(AuthorizeAttributeAclModule), typeof(XmlRolesAclModule))));

            container.Register(Component.For <IAclModule>().ImplementedBy <AuthorizeAttributeAclModule>());
            container.Register(Component.For <IAclModule>().ImplementedBy <XmlRolesAclModule>());


            // Setup cache
#if NET35
            container.Register(Component.For(typeof(ICacheProvider <>)).ImplementedBy(typeof(AspNetCacheProvider <>)));
            container.Register(Component.For <ICacheDependency>().ImplementedBy <AspNetFileCacheDependency>().Named("cacheDependency1")
                               .DependsOn(Dependency.OnValue("fileName", absoluteFileName)));
#else
            container.Register(Component.For <System.Runtime.Caching.ObjectCache>().Instance(System.Runtime.Caching.MemoryCache.Default));
            container.Register(Component.For(typeof(ICacheProvider <>)).ImplementedBy(typeof(RuntimeCacheProvider <>)));
            container.Register(Component.For <ICacheDependency>().ImplementedBy <RuntimeFileCacheDependency>().Named("cacheDependency1")
                               .DependsOn(Dependency.OnValue("fileName", absoluteFileName)));
#endif
            container.Register(Component.For <ICacheDetails>().ImplementedBy <CacheDetails>().Named("cacheDetails1")
                               .DependsOn(Dependency.OnValue("absoluteCacheExpiration", absoluteCacheExpiration))
                               .DependsOn(Dependency.OnValue("slidingCacheExpiration", TimeSpan.MinValue))
                               .DependsOn(ServiceOverride.ForKey <ICacheDependency>().Eq("cacheDependency1"))
                               );

            // Configure the visitors
            container.Register(Component.For <ISiteMapNodeVisitor>().ImplementedBy <UrlResolvingSiteMapNodeVisitor>());

            // Register the sitemap builder
            container.Register(Component.For <IXmlSource>().ImplementedBy <FileXmlSource>().Named("xmlSource1")
                               .DependsOn(Dependency.OnValue("fileName", absoluteFileName)));
            container.Register(Component.For <ISiteMapXmlReservedAttributeNameProvider>().ImplementedBy <SiteMapXmlReservedAttributeNameProvider>()
                               .DependsOn(Dependency.OnValue("attributesToIgnore", new string[0])));

            container.Register(Component.For <ISiteMapBuilder>().ImplementedBy <CompositeSiteMapBuilder>().Named("builder1")
                               .DependsOn(Dependency.OnComponentCollection <ISiteMapBuilder[]>("xmlSiteMapBuilder1", "reflectionSiteMapBuilder1", "visitingSiteMapBuilder1")));

            container.Register(Component.For <ISiteMapBuilder>().ImplementedBy <XmlSiteMapBuilder>().Named("xmlSiteMapBuilder1")
                               .DependsOn(Dependency.OnValue <ISiteMapXmlReservedAttributeNameProvider>(container.Resolve <ISiteMapXmlReservedAttributeNameProvider>()))
                               .DependsOn(ServiceOverride.ForKey <IXmlSource>().Eq("xmlSource1"))
                               );

            container.Register(Component.For <ISiteMapBuilder>().ImplementedBy <ReflectionSiteMapBuilder>().Named("reflectionSiteMapBuilder1")
                               .DependsOn(Dependency.OnValue("includeAssemblies", includeAssembliesForScan))
                               .DependsOn(Dependency.OnValue("excludeAssemblies", new string[0]))
                               );

            container.Register(Component.For <ISiteMapBuilder>().ImplementedBy <VisitingSiteMapBuilder>().Named("visitingSiteMapBuilder1"));

            // Configure the builder sets
            container.Register(Component.For <ISiteMapBuilderSet>().ImplementedBy <SiteMapBuilderSet>().Named("siteMapBuilderSet1")
                               .DependsOn(Dependency.OnValue("instanceName", "default"))
                               .DependsOn(Dependency.OnValue("securityTrimmingEnabled", securityTrimmingEnabled))
                               .DependsOn(Dependency.OnValue("enableLocalization", enableLocalization))
                               .DependsOn(ServiceOverride.ForKey <ISiteMapBuilder>().Eq("builder1"))
                               .DependsOn(ServiceOverride.ForKey <ICacheDetails>().Eq("cacheDetails1"))
                               );

            container.Register(Component.For <ISiteMapBuilderSetStrategy>().ImplementedBy <SiteMapBuilderSetStrategy>()
                               .DependsOn(Dependency.OnComponentCollection <ISiteMapBuilderSet[]>("siteMapBuilderSet1")));
        }
Beispiel #19
0
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            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

            // Configure Windsor to resolve arrays in constructors
            container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel, true));

            var currentAssembly         = this.GetType().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)
                typeof(SiteMapNodeUrlResolver)
            };
            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(Component.For(interfaceType).ImplementedBy(implementationType).LifestyleSingleton()),
                new Assembly[] { siteMapProviderAssembly },
                allAssemblies,
                excludeTypes,
                string.Empty);

            // Multiple implementations of strategy based extension points (and not decorated with [ExcludeFromAutoRegistrationAttribute]).
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => container.Register(Component.For(interfaceType).ImplementedBy(implementationType).LifestyleSingleton()),
                multipleImplementationTypes,
                allAssemblies,
                new Type[0],
                string.Empty);

            // Registration of internal controllers
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => container.Register(Component.For(implementationType).ImplementedBy(implementationType).LifestyleTransient()),
                new Type[] { typeof(IController) },
                new Assembly[] { siteMapProviderAssembly },
                new Type[0],
                string.Empty);

            // Visibility Providers
            container.Register(Component.For <ISiteMapNodeVisibilityProviderStrategy>().ImplementedBy <SiteMapNodeVisibilityProviderStrategy>()
                               .DependsOn(Dependency.OnValue("defaultProviderName", string.Empty)));

            // Pass in the global controllerBuilder reference
            container.Register(Component.For <ControllerBuilder>().Instance(ControllerBuilder.Current));
            container.Register(Component.For <IControllerTypeResolverFactory>().ImplementedBy <ControllerTypeResolverFactory>()
                               .DependsOn(Dependency.OnValue("areaNamespacesToIgnore", new string[0])));

            // Configure Security

            // First registration wins - we must do the outer one first
            container.Register(Component.For <IAclModule>().ImplementedBy <CompositeAclModule>()
                               .DependsOn(Dependency.OnComponentCollection <IEnumerable <IAclModule> >(typeof(AuthorizeAttributeAclModule), typeof(XmlRolesAclModule))));

            container.Register(Component.For <IAclModule>().ImplementedBy <AuthorizeAttributeAclModule>());
            container.Register(Component.For <IAclModule>().ImplementedBy <XmlRolesAclModule>());


            // Setup cache
#if NET35
            container.Register(Component.For(typeof(ICacheProvider <>)).ImplementedBy(typeof(AspNetCacheProvider <>)));
            container.Register(Component.For <ICacheDependency>().ImplementedBy <AspNetFileCacheDependency>().Named("cacheDependency1")
                               .DependsOn(Dependency.OnValue("fileName", absoluteFileName)));
#else
            container.Register(Component.For <System.Runtime.Caching.ObjectCache>().Instance(System.Runtime.Caching.MemoryCache.Default));
            container.Register(Component.For(typeof(ICacheProvider <>)).ImplementedBy(typeof(RuntimeCacheProvider <>)));
            container.Register(Component.For <ICacheDependency>().ImplementedBy <RuntimeFileCacheDependency>().Named("cacheDependency1")
                               .DependsOn(Dependency.OnValue("fileName", absoluteFileName)));
#endif
            container.Register(Component.For <ICacheDetails>().ImplementedBy <CacheDetails>().Named("cacheDetails1")
                               .DependsOn(Dependency.OnValue("absoluteCacheExpiration", absoluteCacheExpiration))
                               .DependsOn(Dependency.OnValue("slidingCacheExpiration", TimeSpan.MinValue))
                               .DependsOn(ServiceOverride.ForKey <ICacheDependency>().Eq("cacheDependency1"))
                               );

            // Configure the visitors
            container.Register(Component.For <ISiteMapNodeVisitor>().ImplementedBy <UrlResolvingSiteMapNodeVisitor>());

            // Prepare for the sitemap node providers
            container.Register(Component.For <IXmlSource>().ImplementedBy <FileXmlSource>().Named("xmlSource1")
                               .DependsOn(Dependency.OnValue("fileName", absoluteFileName)));
            container.Register(Component.For <IReservedAttributeNameProvider>().ImplementedBy <ReservedAttributeNameProvider>()
                               .DependsOn(Dependency.OnValue("attributesToIgnore", new string[0])));

            // Register the sitemap node providers
            container.Register(Component.For <ISiteMapNodeProvider>().ImplementedBy <CompositeSiteMapNodeProvider>().Named("siteMapNodeProvider1")
                               .DependsOn(Dependency.OnComponentCollection <ISiteMapNodeProvider[]>("xmlSiteMapNodeProvider1", "reflectionSiteMapNodeProvider1")));

            container.Register(Component.For <ISiteMapNodeProvider>().ImplementedBy <XmlSiteMapNodeProvider>().Named("xmlSiteMapNodeProvider1")
                               .DependsOn(Dependency.OnValue("includeRootNode", true))
                               .DependsOn(Dependency.OnValue("useNestedDynamicNodeRecursion", false))
                               .DependsOn(ServiceOverride.ForKey <IXmlSource>().Eq("xmlSource1"))
                               );

            container.Register(Component.For <ISiteMapNodeProvider>().ImplementedBy <ReflectionSiteMapNodeProvider>().Named("reflectionSiteMapNodeProvider1")
                               .DependsOn(Dependency.OnValue("includeAssemblies", includeAssembliesForScan))
                               .DependsOn(Dependency.OnValue("excludeAssemblies", new string[0]))
                               );

            // Register the sitemap builders
            container.Register(Component.For <ISiteMapBuilder>().ImplementedBy <SiteMapBuilder>().Named("builder1")
                               .DependsOn(ServiceOverride.ForKey <ISiteMapNodeProvider>().Eq("siteMapNodeProvider1"))
                               );

            // Configure the builder sets
            container.Register(Component.For <ISiteMapBuilderSet>().ImplementedBy <SiteMapBuilderSet>().Named("siteMapBuilderSet1")
                               .DependsOn(Dependency.OnValue("instanceName", "default"))
                               .DependsOn(Dependency.OnValue("securityTrimmingEnabled", securityTrimmingEnabled))
                               .DependsOn(Dependency.OnValue("enableLocalization", enableLocalization))
                               .DependsOn(Dependency.OnValue("visibilityAffectsDescendants", visibilityAffectsDescendants))
                               .DependsOn(Dependency.OnValue("useTitleIfDescriptionNotProvided", useTitleIfDescriptionNotProvided))
                               .DependsOn(ServiceOverride.ForKey <ISiteMapBuilder>().Eq("builder1"))
                               .DependsOn(ServiceOverride.ForKey <ICacheDetails>().Eq("cacheDetails1"))
                               );

            container.Register(Component.For <ISiteMapBuilderSetStrategy>().ImplementedBy <SiteMapBuilderSetStrategy>()
                               .DependsOn(Dependency.OnComponentCollection <ISiteMapBuilderSet[]>("siteMapBuilderSet1")));
        }
        protected override void Load(ContainerBuilder builder)
        {
            bool     securityTrimmingEnabled = false;
            bool     enableLocalization      = true;
            string   absoluteFileName        = HostingEnvironment.MapPath("~/Mvc.sitemap");
            TimeSpan absoluteCacheExpiration = TimeSpan.FromMinutes(5);

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

            var currentAssembly         = this.GetType().Assembly;
            var siteMapProviderAssembly = typeof(SiteMaps).Assembly;
            var allAssemblies           = new Assembly[] { currentAssembly, siteMapProviderAssembly };
            var excludeTypes            = new Type[] {
                typeof(SiteMapNodeVisibilityProviderStrategy),
                typeof(SiteMapXmlReservedAttributeNameProvider),
                typeof(SiteMapBuilderSetStrategy)
            };
            var multipleImplementationTypes = new Type[]  {
                typeof(ISiteMapNodeUrlResolver),
                typeof(ISiteMapNodeVisibilityProvider),
                typeof(IDynamicNodeProvider)
            };

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

            // Multiple implementations of strategy based extension points
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => builder.RegisterType(implementationType).As(interfaceType).SingleInstance(),
                multipleImplementationTypes,
                allAssemblies,
                excludeTypes,
                "^Composite");

            // Registration of internal controllers
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => builder.RegisterType(implementationType).As(interfaceType).AsSelf().InstancePerDependency(),
                new Type[] { typeof(IController) },
                new Assembly[] { siteMapProviderAssembly },
                new Type[0],
                string.Empty);

            // Visibility Providers
            builder.RegisterType <SiteMapNodeVisibilityProviderStrategy>()
            .As <ISiteMapNodeVisibilityProviderStrategy>()
            .WithParameter("defaultProviderName", string.Empty);

            // Pass in the global controllerBuilder reference
            builder.RegisterInstance(ControllerBuilder.Current)
            .As <ControllerBuilder>();

            builder.RegisterType <BuildManagerAdaptor>()
            .As <IBuildManager>();

            builder.RegisterType <ControllerBuilderAdaptor>()
            .As <IControllerBuilder>();

            builder.RegisterType <ControllerTypeResolverFactory>()
            .As <IControllerTypeResolverFactory>()
            .WithParameter("areaNamespacesToIgnore", new string[0]);

            // Configure Security
            builder.RegisterType <AuthorizeAttributeAclModule>()
            .Named <IAclModule>("authorizeAttributeAclModule");
            builder.RegisterType <XmlRolesAclModule>()
            .Named <IAclModule>("xmlRolesAclModule");
            builder.RegisterType <CompositeAclModule>()
            .As <IAclModule>()
            .WithParameter(
                (p, c) => p.Name == "aclModules",
                (p, c) => new[]
            {
                c.ResolveNamed <IAclModule>("authorizeAttributeAclModule"),
                c.ResolveNamed <IAclModule>("xmlRolesAclModule")
            });

#if NET35
            builder.RegisterGeneric(typeof(AspNetCacheProvider <>))
            .As(typeof(ICacheProvider <>));

            builder.RegisterType <AspNetFileCacheDependency>()
            .Named <ICacheDependency>("cacheDependency1")
            .WithParameter("fileName", absoluteFileName);
#else
            builder.RegisterInstance(System.Runtime.Caching.MemoryCache.Default)
            .As <System.Runtime.Caching.ObjectCache>();

            builder.RegisterGeneric(typeof(RuntimeCacheProvider <>))
            .As(typeof(ICacheProvider <>));

            builder.RegisterType <RuntimeFileCacheDependency>()
            .Named <ICacheDependency>("cacheDependency1")
            .WithParameter("fileName", absoluteFileName);
#endif
            builder.RegisterType <CacheDetails>()
            .Named <ICacheDetails>("cacheDetails1")
            .WithParameter("absoluteCacheExpiration", absoluteCacheExpiration)
            .WithParameter("slidingCacheExpiration", TimeSpan.MinValue)
            .WithParameter(
                (p, c) => p.Name == "cacheDependency",
                (p, c) => c.ResolveNamed <ICacheDependency>("cacheDependency1"));

            // Configure the visitors
            builder.RegisterType <UrlResolvingSiteMapNodeVisitor>()
            .As <ISiteMapNodeVisitor>();

            // Prepare for our node providers
            builder.RegisterType <FileXmlSource>()
            .Named <IXmlSource>("xmlSource1")
            .WithParameter("fileName", absoluteFileName);

            builder.RegisterType <SiteMapXmlReservedAttributeNameProvider>()
            .As <ISiteMapXmlReservedAttributeNameProvider>()
            .WithParameter("attributesToIgnore", new string[0]);


            // Register the sitemap node providers
            builder.RegisterType <XmlSiteMapNodeProvider>()
            .Named <ISiteMapNodeProvider>("xmlSiteMapNodeProvider1")
            .WithParameter("includeRootNode", true)
            .WithParameter("useNestedDynamicNodeRecursion", false)
            .WithParameter(
                (p, c) => p.Name == "xmlSource",
                (p, c) => c.ResolveNamed <IXmlSource>("xmlSource1"));

            builder.RegisterType <ReflectionSiteMapNodeProvider>()
            .Named <ISiteMapNodeProvider>("reflectionSiteMapNodeProvider1")
            .WithParameter("includeAssemblies", includeAssembliesForScan)
            .WithParameter("excludeAssemblies", new string[0]);

            builder.RegisterType <CompositeSiteMapNodeProvider>()
            .Named <ISiteMapNodeProvider>("siteMapNodeProvider1")
            .WithParameter(
                (p, c) => p.Name == "siteMapNodeProviders",
                (p, c) => new[]
            {
                c.ResolveNamed <ISiteMapNodeProvider>("xmlSiteMapNodeProvider1"),
                c.ResolveNamed <ISiteMapNodeProvider>("reflectionSiteMapNodeProvider1")
            });

            // Register the sitemap builders
            builder.RegisterType <SiteMapBuilder>()
            .Named <ISiteMapBuilder>("siteMapBuilder1")
            .WithParameter(
                (p, c) => p.Name == "siteMapNodeProvider",
                (p, c) => c.ResolveNamed <ISiteMapNodeProvider>("siteMapNodeProvider1"));

            // Configure the builder sets
            builder.RegisterType <SiteMapBuilderSet>()
            .Named <ISiteMapBuilderSet>("builderSet1")
            .WithParameter("instanceName", "default")
            .WithParameter("securityTrimmingEnabled", securityTrimmingEnabled)
            .WithParameter("enableLocalization", enableLocalization)
            .WithParameter(
                (p, c) => p.Name == "siteMapBuilder",
                (p, c) => c.ResolveNamed <ISiteMapBuilder>("siteMapBuilder1"))
            .WithParameter(
                (p, c) => p.Name == "cacheDetails",
                (p, c) => c.ResolveNamed <ICacheDetails>("cacheDetails1"));

            builder.RegisterType <SiteMapBuilderSetStrategy>()
            .As <ISiteMapBuilderSetStrategy>()
            .WithParameter(
                (p, c) => p.Name == "siteMapBuilderSets",
                (p, c) => c.ResolveNamed <IEnumerable <ISiteMapBuilderSet> >("builderSet1"));
        }
        public override void Load()
        {
            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

            var currentAssembly             = this.GetType().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) => this.Kernel.Bind(interfaceType).To(implementationType).InSingletonScope(),
                new Assembly[] { siteMapProviderAssembly },
                allAssemblies,
                excludeTypes,
                string.Empty);

            // Multiple implementations of strategy based extension points (and not decorated with [ExcludeFromAutoRegistrationAttribute]).
            CommonConventions.RegisterAllImplementationsOfInterface(
                (interfaceType, implementationType) => this.Kernel.Bind(interfaceType).To(implementationType).InSingletonScope(),
                multipleImplementationTypes,
                allAssemblies,
                excludeTypes,
                string.Empty);

            this.Kernel.Bind <ISiteMapNodeVisibilityProviderStrategy>().To <SiteMapNodeVisibilityProviderStrategy>()
            .WithConstructorArgument("defaultProviderName", string.Empty);

            this.Kernel.Bind <ControllerBuilder>().ToConstant(ControllerBuilder.Current);

            this.Kernel.Bind <IControllerTypeResolverFactory>().To <ControllerTypeResolverFactory>()
            .WithConstructorArgument("areaNamespacesToIgnore", new string[0]);

            // Configure Security
            this.Kernel.Bind <AuthorizeAttributeAclModule>().ToSelf();
            this.Kernel.Bind <XmlRolesAclModule>().ToSelf();
            this.Kernel.Bind <IAclModule>().To <CompositeAclModule>()
            .WithConstructorArgument("aclModules",
                                     new IAclModule[] {
                this.Kernel.Get <AuthorizeAttributeAclModule>(),
                this.Kernel.Get <XmlRolesAclModule>()
            });


            // Setup cache
#if NET35
            this.Kernel.Bind(typeof(ICacheProvider <>)).To(typeof(AspNetCacheProvider <>));
            this.Kernel.Bind <ICacheDependency>().To <AspNetFileCacheDependency>().Named("cacheDependency1")
            .WithConstructorArgument("fileName", absoluteFileName);
#else
            this.Kernel.Bind <System.Runtime.Caching.ObjectCache>()
            .ToConstant <System.Runtime.Caching.ObjectCache>(System.Runtime.Caching.MemoryCache.Default);
            this.Kernel.Bind(typeof(ICacheProvider <>)).To(typeof(RuntimeCacheProvider <>));
            this.Kernel.Bind <ICacheDependency>().To <RuntimeFileCacheDependency>().Named("cacheDependency1")
            .WithConstructorArgument("fileName", absoluteFileName);
#endif
            this.Kernel.Bind <ICacheDetails>().To <CacheDetails>().Named("cacheDetails1")
            .WithConstructorArgument("absoluteCacheExpiration", absoluteCacheExpiration)
            .WithConstructorArgument("slidingCacheExpiration", TimeSpan.MinValue)
            .WithConstructorArgument("cacheDependency", this.Kernel.Get <ICacheDependency>("cacheDependency1"));


            // Configure the visitors
            this.Kernel.Bind <ISiteMapNodeVisitor>().To <UrlResolvingSiteMapNodeVisitor>();

            // Prepare for our node providers
            this.Kernel.Bind <IXmlSource>().To <FileXmlSource>().Named("XmlSource1")
            .WithConstructorArgument("fileName", absoluteFileName);
            this.Kernel.Bind <IReservedAttributeNameProvider>().To <ReservedAttributeNameProvider>()
            .WithConstructorArgument("attributesToIgnore", new string[0]);

            // Register the sitemap node providers
            this.Kernel.Bind <ISiteMapNodeProvider>().To <XmlSiteMapNodeProvider>().Named("xmlSiteMapNodeProvider1")
            .WithConstructorArgument("includeRootNode", true)
            .WithConstructorArgument("useNestedDynamicNodeRecursion", false)
            .WithConstructorArgument("xmlSource", this.Kernel.Get <IXmlSource>("XmlSource1"));

            this.Kernel.Bind <ISiteMapNodeProvider>().To <ReflectionSiteMapNodeProvider>().Named("reflectionSiteMapNodeProvider1")
            .WithConstructorArgument("includeAssemblies", includeAssembliesForScan)
            .WithConstructorArgument("excludeAssemblies", new string[0]);

            this.Kernel.Bind <ISiteMapNodeProvider>().To <CompositeSiteMapNodeProvider>().Named("siteMapNodeProvider1")
            .WithConstructorArgument("siteMapNodeProviders",
                                     new ISiteMapNodeProvider[] {
                this.Kernel.Get <ISiteMapNodeProvider>("xmlSiteMapNodeProvider1"),
                this.Kernel.Get <ISiteMapNodeProvider>("reflectionSiteMapNodeProvider1")
            });

            // Register the sitemap builders
            this.Kernel.Bind <ISiteMapBuilder>().To <SiteMapBuilder>().Named("siteMapBuilder1")
            .WithConstructorArgument("siteMapNodeProvider", this.Kernel.Get <ISiteMapNodeProvider>("siteMapNodeProvider1"));

            // Configure the builder sets
            this.Kernel.Bind <ISiteMapBuilderSet>().To <SiteMapBuilderSet>().Named("siteMapBuilderSet1")
            .WithConstructorArgument("instanceName", "default")
            .WithConstructorArgument("securityTrimmingEnabled", securityTrimmingEnabled)
            .WithConstructorArgument("enableLocalization", enableLocalization)
            .WithConstructorArgument("visibilityAffectsDescendants", visibilityAffectsDescendants)
            .WithConstructorArgument("useTitleIfDescriptionNotProvided", useTitleIfDescriptionNotProvided)
            .WithConstructorArgument("siteMapBuilder", this.Kernel.Get <ISiteMapBuilder>("siteMapBuilder1"))
            .WithConstructorArgument("cacheDetails", this.Kernel.Get <ICacheDetails>("cacheDetails1"));

            this.Kernel.Bind <ISiteMapBuilderSetStrategy>().To <SiteMapBuilderSetStrategy>()
            .WithConstructorArgument("siteMapBuilderSets",
                                     new ISiteMapBuilderSet[] {
                this.Kernel.Get <ISiteMapBuilderSet>("siteMapBuilderSet1")
            });
        }