Не удалось разрешить службу для типа ‘Домен.IBlobModelCache’ при попытке активировать ‘Domain.EntityMaterializerSource’

#asp.net-core #dependency-injection #entity-framework-core #ef-core-3.1

#asp.net-core #внедрение зависимостей #entity-framework-core #ef-core-3.1

Вопрос:

Хотя сообщение об ошибке кажется очевидным, я считаю, что оно отличается от других вопросов. Как вы можете видеть в моем, Startup я зарегистрировал IBlobModelCache службу.

 public class Startup
{
    ...
    public virtual void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();

        services.AddDbContext<DataContext>(options =>
        {
            options
                .ReplaceService<IEntityMaterializerSource, Domain.EntityMaterializerSource>();
                .UseSqlServer(
                    Configuration.GetConnectionString("Default"),
                    opt => opt.MigrationsAssembly("API")
                    );
        });

        services
            .AddAuthentication(ConfigureAthentication)
            .AddJwtBearer(ConfigureJwtBearer);

        services
            .AddLogging(ConfigureLogging)
            .AddTransient<IBlobPersisterFactory, BlobPersisterFactory>()
            .AddTransient<IBlobDbContextSavingHandler, BlobDbContextSavingHandler>()
            .AddTransient<IBlobDbContextModelCreator, BlobDbContextModelCreator>()
            .AddSingleton<IBlobModelCache, BlobModelCache>() // It is here
            .AddOptions<DiskBlobStorageSettings>().Configure<IConfiguration>((settings, config) => config.Bind("BlobStorage", settings));

    }
    ...
}

  

И вот конструктор моих служб, чтобы вы могли видеть, что в них нет никакого цикла.

 class EntityMaterializerSource : Base.EntityMaterializerSource
{
    public EntityMaterializerSource(
        [NotNull] EntityMaterializerSourceDependencies dependencies,
        IBlobModelCache blobModelCache
        )
        : base(dependencies)
    {
        BlobModelCache = blobModelCache;
        OnMaterializedMethod = typeof(EntityMaterializerSource)
            .GetMethod(nameof(OnMaterialized), BindingFlags.Instance | BindingFlags.NonPublic);
    }

}

class BlobModelCache : IBlobModelCache
{
    // Has no constructor
}
  

BlobModelCache Проблема успешно решена в других службах, и ошибка возникает только тогда, когда EF необходимо материализовать объекты.

Все, что мне нужно, это получать уведомления, когда объект материализуется из базы данных, и я не смог найти никакого решения, кроме расширения EntityMaterializerSource. Я использую EF Core 3.1.8 и ASP.Net Ядро 3.1.