因此,我需要在我的IMemoryCache核心应用程序中使用ASP.NET,在大多数地方,它被注入控制器并按预期工作。现在我需要缓存菜单的一部分,菜单逻辑作为布局视图的一部分被调用。所以,没有一个控制器可以谈论。我的启动程序已经包含了以下几个方面,可以很好地应用于其他方面:
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,所以没有要传入的缓存参数。
我在这里看到了一些关于这个问题的问题,但是没有一个能直接而正确地回答这个问题。
由于这是我的项目,我将永远是唯一的程序员,我更喜欢一个简单的解决方案,而不是建议重新架构它的一堆,如果我不能想出一个好的解决方案,我将忽略缓存这一点。
发布于 2019-12-21 07:31:36
菜单逻辑作为布局视图的一部分被调用
您仍然可以在布局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内核中编译。如果是这样的话,您很可能是在.NET框架上运行,引用了System.Web。这就是旧的ASP.NET,它与ASP.NET核心完全不兼容。绝对不能将这两种框架混为一谈。在ASP.NET核心中,无法静态地检索当前的HttpContext。您必须在某个时候使用依赖注入。
https://stackoverflow.com/questions/59433998
复制相似问题