public MemoryCacheNavigationTreeBuilder(
            INavigationTreeBuilder implementation,
            IMemoryCache cache,
            IOptions<MemoryCacheNavigationTreeBuilderOptions> optionsAccessor,
            INavigationCacheKeyResolver cacheKeyResolver,
            ILogger<MemoryCacheNavigationTreeBuilder> logger)
        {
            if (implementation == null) { throw new ArgumentNullException(nameof(implementation)); }
            if (implementation is MemoryCacheNavigationTreeBuilder) { throw new ArgumentException("implementation cannot be an instance of MemoryCacheNavigationTreeBuilder"); }
            if (cache == null) { throw new ArgumentNullException(nameof(cache)); }
            if (logger == null) { throw new ArgumentNullException(nameof(logger)); }
            if (optionsAccessor == null) { throw new ArgumentNullException(nameof(optionsAccessor)); }
            if (cacheKeyResolver == null) { throw new ArgumentNullException(nameof(cacheKeyResolver)); }

            this.implementation = implementation;
            this.cache = cache;
            log = logger;
            options = optionsAccessor.Value;
            this.cacheKeyResolver = cacheKeyResolver;
        }
        public MemoryCacheNavigationTreeBuilder(
            INavigationTreeBuilder implementation,
            IMemoryCache cache,
            IOptions <MemoryCacheNavigationTreeBuilderOptions> optionsAccessor,
            INavigationCacheKeyResolver cacheKeyResolver,
            ILogger <MemoryCacheNavigationTreeBuilder> logger)
        {
            if (implementation == null)
            {
                throw new ArgumentNullException(nameof(implementation));
            }
            if (implementation is MemoryCacheNavigationTreeBuilder)
            {
                throw new ArgumentException("implementation cannot be an instance of MemoryCacheNavigationTreeBuilder");
            }
            if (cache == null)
            {
                throw new ArgumentNullException(nameof(cache));
            }
            if (logger == null)
            {
                throw new ArgumentNullException(nameof(logger));
            }
            if (optionsAccessor == null)
            {
                throw new ArgumentNullException(nameof(optionsAccessor));
            }
            if (cacheKeyResolver == null)
            {
                throw new ArgumentNullException(nameof(cacheKeyResolver));
            }

            this.implementation = implementation;
            this.cache          = cache;
            log     = logger;
            options = optionsAccessor.Value;
            this.cacheKeyResolver = cacheKeyResolver;
        }