#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. Это действительно близко к работе. моя служба пользователей теперь отлично справляется, но все, что вводит эту службу, больше не может определить ее зависимость.