首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果IMemoryCache被注入了*而不是依赖项,那么在ASP.NET内核中使用它是可能的吗?

问如果IMemoryCache被注入了*而不是依赖项,那么在ASP.NET内核中使用它是可能的吗?
EN

Stack Overflow用户
提问于 2019-12-21 06:30:57
回答 1查看 955关注 0票数 1

因此,我需要在我的IMemoryCache核心应用程序中使用ASP.NET,在大多数地方,它被注入控制器并按预期工作。现在我需要缓存菜单的一部分,菜单逻辑作为布局视图的一部分被调用。所以,没有一个控制器可以谈论。我的启动程序已经包含了以下几个方面,可以很好地应用于其他方面:

代码语言:javascript
复制
services.AddMemoryCache();

作为布局一部分的调用如下所示:

代码语言:javascript
复制
@(await new MenuUtility().DisplayNavBar(Html, showMenus))

将在其中使用缓存的MenuUtility类具有如下调用:

代码语言:javascript
复制
public class MenuUtility
{
  private IMemoryCache _cache;

    public MenuUtility()
    {
       _cache = HttpContext.Current.RequestServices.GetService<MemoryCache>();
    }

    // Rest of class logic
}

问题是,我希望返回的缓存服务总是空的。有什么东西我忘了吗?我尝试将services.AddScoped<MenuUtility>();添加到ConfigureServices调用中,认为这将允许我在构造函数中传递缓存接口,但是由于我显式地调用MenuUtility,所以没有要传入的缓存参数。

我在这里看到了一些关于这个问题的问题,但是没有一个能直接而正确地回答这个问题。

由于这是我的项目,我将永远是唯一的程序员,我更喜欢一个简单的解决方案,而不是建议重新架构它的一堆,如果我不能想出一个好的解决方案,我将忽略缓存这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-21 07:31:36

菜单逻辑作为布局视图的一部分被调用

您仍然可以在布局Razor视图中使用@inject指令将服务注入视图:

代码语言:javascript
复制
@inject MenuUtility menuUtility

@await menuUtility.DisplayNavBar(Html, showMenus)

要做到这一点,只需将MenuUtility注册为服务,然后在MenuUtility中使用构造函数注入来解析IMemoryCache。

代码语言:javascript
复制
// in Startup.ConfigureServices
services.AddTransient<MenuUtility>();
代码语言:javascript
复制
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。您必须在某个时候使用依赖注入。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59433998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档