【问题标题】:IMemoryCache in Scoped Service范围服务中的 IMemoryCache
【发布时间】:2021-11-14 12:43:09
【问题描述】:

我有一个范围服务,我希望将 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.Activators.Reflection.DefaultConstructorFinder”的构造函数 '排班.基础设施.身份.服务.用户服务' 可以使用可用的服务和参数调用: 无法解析构造函数“Void”的参数“Microsoft.Extensions.Caching.Memory.IMemoryCache memoryCache” .ctor(Microsoft.AspNetCore.Http.IHttpContextAccessor, Microsoft.Extensions.Caching.Memory.IMemoryCache)'。

有人对为什么会这样有任何建议吗?

【问题讨论】:

  • 您能否分享更多详细信息如何设置 Autofac?
  • @user2250152 我添加了有关如何配置 autofac 的详细信息
  • 您在 Autofac 中显示的连接的服务不是您在异常中显示为已解决的服务。 AuthenticatedUserService 既不是 IUserService 也不是 UserService,尽管名称看起来很相似。
  • @TravisIllig 我的错误,这只是该类的旧名称,我已对其进行了修改,并且可以向您保证它们都匹配。
  • 很公平。细节在这些事情中很重要——很多答案实际上是因为这个人正在解决或注册错误的类型。 ;)

标签: c# .net-core dependency-injection autofac


【解决方案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 注册为SingleInstanceIOptions&lt;&gt;,因为MemoryCache 依赖于它。

【讨论】:

  • 这真的很接近工作了。我的 userService 现在可以完美解决,但是注入该服务的任何东西都无法再找到它的依赖项。
猜你喜欢
  • 2019-06-02
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 2021-01-18
  • 2021-06-19
  • 2022-06-28
  • 2020-04-09
  • 2015-10-31
相关资源
最近更新 更多