C# 无法从ViewComponent中解析缓存服务

C# 无法从ViewComponent中解析缓存服务,c#,dependency-injection,.net-core,razor-pages,memorycache,C#,Dependency Injection,.net Core,Razor Pages,Memorycache,我正在Startup.cs中注册缓存服务,如下所示: public void ConfigureServices(IServiceCollection services) { services.AddMemoryCache(); services.AddTransient<DataFacade, DataFacade>(); ... } using MyApp.Services; us

我正在Startup.cs中注册缓存服务,如下所示:

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddMemoryCache();            
        services.AddTransient<DataFacade, DataFacade>();
        ...
    }
using MyApp.Services;
using MyApp.Website.ModelBuilder;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc;

namespace MyApp.Website.ViewComponents
{
    [ViewComponent]
    public class Header : ViewComponent
    {
        private readonly HeaderModelBuilder _modelBuilder;

        public Header(HeaderModelBuilder modelBuilder)
        {
            _modelBuilder = modelBuilder;
        }
using System;
using MyApp.Data;
using MyApp.Data.ExternalSiteData;
using MyApp.Domain.Services.Data;
using Microsoft.Extensions.Caching.Memory;

namespace MyApp.Services
{
    public class DataFacade
    {
        private MemoryCache _cache;
        public DataFacade(MemoryCache memoryCache)
        {
            _cache = memoryCache;
        }
这将调用ModelBuilder组件,并具有如下构造函数:

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddMemoryCache();            
        services.AddTransient<DataFacade, DataFacade>();
        ...
    }
using MyApp.Services;
using MyApp.Website.ModelBuilder;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc;

namespace MyApp.Website.ViewComponents
{
    [ViewComponent]
    public class Header : ViewComponent
    {
        private readonly HeaderModelBuilder _modelBuilder;

        public Header(HeaderModelBuilder modelBuilder)
        {
            _modelBuilder = modelBuilder;
        }
using System;
using MyApp.Data;
using MyApp.Data.ExternalSiteData;
using MyApp.Domain.Services.Data;
using Microsoft.Extensions.Caching.Memory;

namespace MyApp.Services
{
    public class DataFacade
    {
        private MemoryCache _cache;
        public DataFacade(MemoryCache memoryCache)
        {
            _cache = memoryCache;
        }
…并且ModelBuilder服务引用DataFacade服务:

using MyApp.Data.ExternalCountryData;
using MyApp.Services;
using MyApp.Website.Constants;
using MyApp.Website.Models;

namespace MyApp.Website.ModelBuilder
{
    public class HeaderModelBuilder
    {
        private readonly DataFacade _dataFacade;

        public HeaderModelBuilder(DataFacade dataFacade)
        {
            _dataFacade = dataFacade;
        }
…其构造函数如下所示:

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddMemoryCache();            
        services.AddTransient<DataFacade, DataFacade>();
        ...
    }
using MyApp.Services;
using MyApp.Website.ModelBuilder;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc;

namespace MyApp.Website.ViewComponents
{
    [ViewComponent]
    public class Header : ViewComponent
    {
        private readonly HeaderModelBuilder _modelBuilder;

        public Header(HeaderModelBuilder modelBuilder)
        {
            _modelBuilder = modelBuilder;
        }
using System;
using MyApp.Data;
using MyApp.Data.ExternalSiteData;
using MyApp.Domain.Services.Data;
using Microsoft.Extensions.Caching.Memory;

namespace MyApp.Services
{
    public class DataFacade
    {
        private MemoryCache _cache;
        public DataFacade(MemoryCache memoryCache)
        {
            _cache = memoryCache;
        }
但是,在运行代码时,Program.cs会抛出以下命令:

InvalidOperationException:无法解析类型的服务 “Microsoft.Extensions.Caching.Memory.MemoryCache”时尝试 激活“MyApp.Services.DataFacade”

如果我注释掉视图组件,应用程序的其他部分可以很好地访问缓存


为什么视图组件会出现问题?我是否错误地注册了一个服务?

注入了
IMemoryCache
抽象,而不是实现

public class DataFacade {
    private readonly IMemoryCache _cache;

    public DataFacade(IMemoryCache memoryCache) {
        _cache = memoryCache;
    }

    //...
参考文献 添加内存缓存的源代码在向服务集合注册时添加了接口

/// <summary>
/// Adds a non distributed in memory implementation of <see cref="IMemoryCache"/> to the
/// <see cref="IServiceCollection" />.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
public static IServiceCollection AddMemoryCache(this IServiceCollection services)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    services.AddOptions();
    services.TryAdd(ServiceDescriptor.Singleton<IMemoryCache, MemoryCache>());

    return services;
}
//
///将的非分布式内存中实现添加到
/// .
/// 
///要将服务添加到的。
///这样就可以链接其他调用。
公共静态IServiceCollection AddMemoryCache(此IServiceCollection服务)
{
if(服务==null)
{
抛出新的ArgumentNullException(nameof(services));
}
services.AddOptions();
services.TryAdd(servicescriptor.Singleton());
返回服务;
}