IMemoryCache в службе с ограниченной областью действия

#c# #.net-core #dependency-injection #autofac

Вопрос:

У меня есть служба с областью действия, в которую я хочу внедрить IMemoryCache.

IMemoryCache был добавлен во время запуска с использованием следующего кода:

 services.AddMemoryCache();
services.AddScoped<IUserService, UserService>();
 

Autofac настраивается в Program.cs следующим образом:

 public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                        .ConfigureWebHostDefaults(webBuilder =>
                        {
                            webBuilder.UseStartup<Startup>();
                        });
 

У меня есть другой класс, UserService, с помощью которого я хотел бы получить доступ к кэшированным данным, но у меня возникли проблемы с DI. Я должен добавить, что я использую AutoFac, но также пытался отключить это и получить тот же результат:

Ни один из конструкторов, найденных с помощью ‘Autofac.Core.Активаторы.Отражение.DefaultConstructorFinder» по типу » в реестре.Инфраструктура.Идентичность.Услуги.Служба пользователей» может быть вызвана с помощью доступных служб и параметров: Не удается разрешить параметр » Microsoft.Расширения.Кэширование.Память.Кэш памяти IMemoryCache» конструктора «Void .ctor(Microsoft.AspNetCore.Http.IHttpContextAccessor, Microsoft.Расширения.Кэширование.Память.IMemoryCache)’.

У кого-нибудь есть какие-либо предложения относительно того, почему это может быть?

Комментарии:

1. Не могли бы вы поделиться более подробной информацией о том, как вы настраиваете Autofac?

2. @user2250152 Я добавил подробную информацию о том, как настроен autofac

3. Службы, которые вы показываете подключенными в Autofac, не являются службами, которые вы показываете как разрешенные в исключении. AuthenticatedUserService не является ни IUserService тем , ни UserService другим, хотя названия выглядят похожими.

4. @TravisIllig моя ошибка, это было просто старое название класса, я исправил их и могу заверить вас, что они оба совпадают.

5. Справедливо. Детали важны в этих вещах — многие ответы на самом деле таковы, потому что человек решает или регистрирует неправильный тип. 😉

Ответ №1:

Это работает для меня с Autofac:

 public interface IUserService
{
}

public class UserService : IUserService
{
    public UserService(IMemoryCache memoryCache)
    {
    }
}

static void Main(string[] args)
{
    Console.WriteLine("Hello World!");
    // autofac container builder
    var builder = new ContainerBuilder();
    builder.RegisterType<MemoryCache>().As<IMemoryCache>().SingleInstance();
    builder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope();
    builder.RegisterGeneric(typeof(OptionsManager<>)).As(typeof(IOptions<>)).SingleInstance();
    builder.RegisterGeneric(typeof(OptionsManager<>)).As(typeof(IOptionsSnapshot<>)).InstancePerLifetimeScope();
    builder.RegisterGeneric(typeof(OptionsMonitor<>)).As(typeof(IOptionsMonitor<>)).SingleInstance();
    builder.RegisterGeneric(typeof(OptionsFactory<>)).As(typeof(IOptionsFactory<>));
    builder.RegisterGeneric(typeof(OptionsCache<>)).As(typeof(IOptionsMonitorCache<>)).SingleInstance();

    var container = builder.Build();
    using (var scope = container.BeginLifetimeScope())
    {
        var us = scope.Resolve<IUserService>();
    }
}
 

Я зарегистрировался IMemoryCache как SingleInstance и IOptions<> потому MemoryCache , что от этого зависит.

Комментарии:

1. Это действительно близко к работе. моя служба пользователей теперь отлично справляется, но все, что вводит эту службу, больше не может определить ее зависимость.