Custom indexers failing at boot

for version 8.13.1

We have a custom table that we would like to index through Examine. There for I created a composition and a specific component.

Which contains registration of an IndexCreator, an IndexPopulator and a IValueSetBuilder. The IndexPopulator registration throws an error at boot time.

{“Unresolved dependency [Target Type: Umbraco.Web.Search.ExamineComponent], [Parameter: backgroundIndexRebuilder(Umbraco.Web.Search.BackgroundIndexRebuilder)], [Requested dependency: ServiceType:Umbraco.Web.Search.BackgroundIndexRebuilder, ServiceName:]”}

Specifics
The registration of StenopeIndexPopulator generates the boot failure.
The registation of StenopeIndexCreators works, and my Index is effectively created.

Steps to reproduce
Create a component for custom table indexing

using Examine;
using Umbraco.Core;
using Umbraco.Core.Composing;

namespace Newsroom.Core.Startup.Composers.Stenope
{
    public class StenopeIndexComposer : IUserComposer
    {
        public void Compose(Composition composition)
        {
            composition.RegisterUnique<StenopeIndexValueSetBuilder>();
            composition.Register<StenopeIndexPopulator>(Lifetime.Singleton);
            composition.RegisterUnique<StenopeIndexCreator>();
        }
    }

    public class StenopeIndexComponent : IComponent
    {
        private readonly IExamineManager _examineManager;
        private readonly StenopeIndexCreator _indexCreator;

        public StenopeIndexComponent(IExamineManager examineManager, StenopeIndexCreator indexCreator)
        {
            _examineManager = examineManager;
            _indexCreator = indexCreator;
        }

        public StenopeIndexCreator IndexCreator => _indexCreator;

        public void Initialize()
        {
            foreach (var index in IndexCreator.Create())
                _examineManager.AddIndex(index);
        }

        public void Terminate()
        {
            _indexCreator.Dispose();
        }
    }
}

using Examine;
using Examine.LuceneEngine.Providers;
using Lucene.Net.Analysis.Standard;
using Newsroom.Core.Interfaces.Services.Stenope;
using Newsroom.Core.Models.Database;
using System;
using System.Collections.Generic;
using System.Linq;
using Umbraco.Examine;
using Umbraco.Web.Search;

namespace Newsroom.Core.Startup.Composers.Stenope
{
    public class StenopeIndexPopulator : IndexPopulator
    {
        private readonly StenopeIndexValueSetBuilder mediaBuilder;
        private readonly IStenopeMediaService mediaService;

        public StenopeIndexPopulator(StenopeIndexValueSetBuilder mediaBuilder, IStenopeMediaService mediaService)
        {
            this.mediaBuilder = mediaBuilder;
            this.mediaService = mediaService;

            RegisterIndex("StenopeIndex");
        }

        protected override void PopulateIndexes(IReadOnlyList<IIndex> indexes)
        {
            var medias = mediaService.GetAll();
            if (medias != null && medias.Any())
            {
                foreach (var index in indexes)
                {
                    index.IndexItems(mediaBuilder.GetValueSets(medias.ToArray()));
                }
            }
        }
    }

    public class StenopeIndexCreator : LuceneIndexCreator, IUmbracoIndexesCreator, IDisposable
    {
        protected Lucene.Net.Store.Directory Directory { get; set; }

        public override IEnumerable<IIndex> Create()
        {
            Directory = CreateFileSystemLuceneDirectory("StenopeIndex");
            var index = new LuceneIndex("StenopeIndex",
                Directory,
                new FieldDefinitionCollection(
                    new FieldDefinition("caption", FieldDefinitionTypes.FullTextSortable),
                    new FieldDefinition("copyright", FieldDefinitionTypes.FullText)
                ),
                new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30));

            return new[] { index };
        }

        public void Dispose()
        {
            if (Directory != null)
            {
                Directory.Dispose();
            }
        }
    }

    public class StenopeIndexValueSetBuilder : IValueSetBuilder<StenopeMedia>
    {
        public IEnumerable<ValueSet> GetValueSets(params StenopeMedia[] medias)
        {
            foreach (var media in medias)
            {
                var indexValues = new Dictionary<string, object>
                {
                    ["caption"] = media.Caption,
                    ["copyright"] = media.Copyright
                };

                var valueSet = new ValueSet(media.UniqueId.ToString(), "media", indexValues);

                yield return valueSet;
            }
        }
    }

}

Expected result / actual result
Looking into the Umbraco Code ExamineComposer, is registering all dependencies of the ExamineComponent. So that’s how it should be, but I don’tknow what could interfere with the registration of my component, or I’m probably missing somehting that is not documented.

To Sebastian Janssen : My IStenopeMediaService is registered… In another composer… So before closing tickets, maybe you can wait for an answer !


This is a companion discussion topic for the original entry at https://our.umbraco.com/forum/106815-custom-indexers-failing-at-boot