将 memorycache 注入 .NET 5 控制台应用程序

Posted

技术标签:

【中文标题】将 memorycache 注入 .NET 5 控制台应用程序【英文标题】:Injecting memorycache into a .NET 5 console app 【发布时间】:2021-11-26 15:28:43 【问题描述】:

我有一个 .NET 5 控制台应用程序,它将在后台工作程序中运行一个长时间运行的进程。我收到一个编译错误提示:

“IServiceCollection”不包含“AddMemoryCache”的定义,并且找不到接受“IServiceCollection”类型的第一个参数的可访问扩展方法“AddMemoryCache”(您是否缺少 using 指令或程序集引用?)

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using MyBot;

using IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices((hostContext, services) =>
    
        services.AddLogging();
        services.AddSingleton<User>();
        services.AddMemoryCache();
        services.AddHostedService<Worker>();
    )
    .Build();

await host.RunAsync();

我想在我的 Worker 类中注入一个内存缓存,并打算在我的启动代码中注册它。注意 - 不注册 MemoryCache 会导致运行时出现依赖解析问题。

很多示例建议可以使用 AddMemoryCache,但是,我的应用程序不是显示大多数示例的 ASP.NET 应用程序。

我的工人阶级看起来像这样:

public class Worker : BackgroundService
    
        private readonly ILogger<Worker> _logger;
        private User _user;
        private IMemoryCache _cache;

        public Worker(ILogger<Worker> logger, User user, IMemoryCache memoryCache)
        
            _logger = logger;
            _user = user;
            _cache = memoryCache;
        

如何在非 asp.net 应用程序中将 MemoryCache 对象注入到我的 Worker 类中?有什么想法吗?

【问题讨论】:

您是否在项目中遗漏了对 Microsoft.Extensions.Caching.Memory.dll 程序集的引用? @sbecker - 非常感谢你是对的。将其添加为 nuget,现在可以使用。谢谢 - 我添加了一个答案。不是很彻底。但是,如果没有其他人发布更好的内容,也许您可​​以将其标记为正确。 【参考方案1】:

要使用内存缓存,您必须确保项目具有对 Microsoft.Extensions.Caching.Memory.dll 程序集的引用。 从扩展方法AddMemoryCache()的documentation可以看出。

【讨论】:

迁移到.net5.0后,这是理想的解决方案。对我来说,我使用的是 EfCore,我删除了它们,因为我不再使用它,因为我们采用了微服务并且我们使用 Dapper,所以在我从相关应用程序中删除了 EFCore 并移植到 .net5.0 之后,我开始了在我从 nuget 添加此错误之前看到此错误。

以上是关于将 memorycache 注入 .NET 5 控制台应用程序的主要内容,如果未能解决你的问题,请参考以下文章

MemoryCache AbsoluteExpiration 行为奇怪

MemoryCache.Default 在 .NET Core 中不可用?

.net MemoryCache - 通知删除的项目

在 .NET 中,为啥 ObjectCache 是 MemoryCache 的首选类型?

.Net Core缓存组件(MemoryCache)缓存篇

正确使用 .NET MemoryCache 的锁定模式