Внедрение сервисов с ограниченным доступом из одноэлементного сервиса в .net core 2.1 - PullRequest
0 голосов
/ 25 октября 2018

У меня есть cacheHelper.Когда я добавляю зависимость CacheHelper для запуска с «AddScoped», он работает.Но CacheHelper.cs выполняется для каждого запроса.Итак, я конвертирую в «AddSingleton», как показано ниже.Но я получаю сообщение об ошибке, подобное этому: Невозможно использовать обслуживаемую область «MyProject.DataAccess.IUnitOfWork» из синглтона «MyProject.Caching.ICacheHelper» Как я могу исправить эту проблему?

Strartup.cs

public void ConfigureServices(IServiceCollection services)
    {
        services.AddHttpContextAccessor();
        services.AddScoped<IUnitOfWork, UnitOfWork>();
        services.AddScoped<IJwtHelper, JwtHelper>();
        services.AddScoped<IAuditHelper, AuditHelper>();
        services.TryAdd(ServiceDescriptor.Singleton<IMemoryCache, MemoryCache>());
        services.AddSingleton<ICacheHelper, CacheHelper>();
        services.AddMvc();

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    }

CacheHelper.cs

public class CacheHelper : ICacheHelper
{
    private readonly IUnitOfWork unitOfWork;
    public IMemoryCache Cache { get; }

    public CacheHelper(IUnitOfWork unitOfWork, IMemoryCache cache)
    {
        this.unitOfWork = unitOfWork;
        Cache = cache;
    }

    public void SetCommonCacheItems()
    {
        var cities = unitOfWork.CityRepo.GetAll();
        Cache.Set("cities", cities);

        string obj;
        Cache.TryGetValue<string>("cities", out obj);
    }

    public string GetCities()
    {
        string obj;
        Cache.TryGetValue<string>("cities", out obj);

        return obj;
    }
}

1 Ответ

0 голосов
/ 25 октября 2018

То, как вы это делали раньше, было правильным.ICacheHelper должен и должен быть ограничен.

Просто ваша реализация кэша неверна.Получить города будет называться, он проверяет кеш.Если не найден, он получит данные и поместит их в кеш.

public class CacheHelper : ICacheHelper
{
    private readonly IUnitOfWork unitOfWork;
    public IMemoryCache Cache { get; }

    public CacheHelper(IUnitOfWork unitOfWork, IMemoryCache cache)
    {
        this.unitOfWork = unitOfWork;
        Cache = cache;
    }

    public string GetCities()
    {
        if(!Cache.TryGetValue<string>("cities", string out cities))
        {
            // not found in cache, obtain it
            cities = unitOfWork.CityRepo.GetAll();
            Cache.Set("cities", cities);
        }

        return cities;
    }
}

Вам не нужен SetCommonCacheItems() метод.Важно то, что IMemoryCache является статическим, поскольку он будет содержать данные.UoW должен быть ограничен из-за базы данных, в противном случае у вас будут утечки памяти (особенно при использовании EF Core, поскольку он кэширует / отслеживает объекты).

...