![](/img/trans.png)
[英]Use IMemoryCache with Unity DI Container in ASP.net core application
[英]Possible to use IMemoryCache in ASP.NET Core if it is *not* dependency injected?
所以我需要在我的 ASP.NET Core 应用程序中使用 IMemoryCache,在大多数地方它被 DI 到控制器中并按预期工作。 现在我需要缓存部分菜单,菜单逻辑作为布局视图的一部分被调用。 所以,没有控制器可言。 我的 Startup 已经包含以下内容,它适用于其他事情:
services.AddMemoryCache();
作为布局一部分的调用如下所示:
@(await new MenuUtility().DisplayNavBar(Html, showMenus))
将使用缓存的 MenuUtility 类具有如下所示的调用:
public class MenuUtility
{
private IMemoryCache _cache;
public MenuUtility()
{
_cache = HttpContext.Current.RequestServices.GetService<MemoryCache>();
}
// Rest of class logic
}
问题是,我希望返回的缓存服务始终为空。 有什么我忘记了吗? 我试图添加services.AddScoped<MenuUtility>();
到 ConfigureServices 调用,认为这将允许我在构造函数中传递缓存接口,但是由于我显式调用 MenuUtility,因此我没有要传入的缓存参数。
我在这里看到一些关于这个问题的问题,但没有直接和正确地回答它。
由于这是我的项目,我将永远是唯一的程序员,我更喜欢一个简单的解决方案,而不是建议来重新构建一堆它,如果我不能想出一个好的解决方案,我将不考虑缓存这个。
菜单逻辑作为布局视图的一部分被调用
您仍然可以在布局 Razor 视图中使用@inject
指令将服务注入视图:
@inject MenuUtility menuUtility
@await menuUtility.DisplayNavBar(Html, showMenus)
要使其工作,您只需要将MenuUtility
注册为服务,然后在MenuUtility
使用构造函数注入来解析IMemoryCache
:
// in Startup.ConfigureServices
services.AddTransient<MenuUtility>();
public class MenuUtility
{
private readonly IMemoryCache _cache;
public MenuUtility(IMemoryCache cache)
{
_cache = cache;
}
// …
}
您通常应该避免使用new
创建实用程序和服务。 很有可能你确实对某个框架组件有一些依赖,那么你绝对应该使用依赖注入来自动解决这个依赖。
顺便提一句。 HttpContext.Current
不应在 ASP.NET Core 中编译。 如果是这样,很可能是您在引用System.Web
的 .NET Framework 上运行。 那是与 ASP.NET Core 完全不兼容的旧 ASP.NET。 你绝对不应该混合这两个框架。 在 ASP.NET Core 中,无法静态检索当前 HttpContext。 您必须在某些时候使用依赖注入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.