Невозможно разрешить службу кэширования из ViewComponent - PullRequest
2 голосов
/ 14 октября 2019

Я регистрирую службу кэширования в Startup.cs следующим образом:

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddMemoryCache();            
        services.AddTransient<DataFacade, DataFacade>();
        ...
    }

В этом же проекте мой заголовок _Layout.cshtml содержит ViewComponent

@await Component.InvokeAsync(nameof(ViewComponents.PageHeader))

Это делаетвызывает компонент ModelBuilder и имеет конструктор следующим образом:

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;
        }

... и сервис 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;
        }

..., конструктор которого имеет видследующим образом:

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 '.

Если я закомментирую компонент представления, к кэшу могут нормально обращаться другие части приложения.

Почему у компонента представления будут проблемы? Я неправильно регистрирую одну из служб?

1 Ответ

2 голосов
/ 14 октября 2019

Внедрить абстракцию IMemoryCache, а не реализацию

public class DataFacade {
    private readonly IMemoryCache _cache;

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

    //...

Ссылка Использовать IMemoryCache

Исходный код, который добавляет кэш памяти, добавляет интерфейс при регистрации вколлекция услуг

/// <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;
}

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...