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