Когда используется Application Storage в контексте ASP.NET Core?

«Когда используется Application Storage в контексте ASP.NET Core?» — вопрос из категории ASP.NET Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В ASP.NET Core нет встроенной абстракции с точным названием "Application Storage". Этот термин может относиться к одному из следующих паттернов хранения данных на уровне приложения:

  1. In-Memory Storage (Память приложения):

    • Когда использовать: Для кэширования общих, часто читаемых данных, которые дорого вычислять и которые не критичны к потере при перезапуске приложения.
    • Как реализовать: Через IMemoryCache.

      public class MyService {
      private readonly IMemoryCache _cache;
      public MyService(IMemoryCache cache) => _cache = cache;
      
      public async Task<MyData> GetDataAsync() {
          return await _cache.GetOrCreateAsync("myKey", async entry => {
              entry.SlidingExpiration = TimeSpan.FromMinutes(5);
              return await ExpensiveDatabaseCallAsync();
          });
      }
      }
  2. Статические поля или сервисы с Singleton lifetime:

    • Когда использовать: Крайне осторожно, для глобального, неизменяемого состояния (например, конфигурация, справочники), доступного всем запросам. Небезопасно для изменяемых данных из-за проблем с параллелизмом.
      public static class AppState {
      public static readonly IReadOnlyDictionary<string, string> Config;
      }
      // Или в Startup.cs:
      services.AddSingleton<MySharedService>();
  3. Работа с файловой системой (App-специфичные папки):

    • Когда использовать: Для хранения файлов, специфичных для данного экземпляра приложения (логи, сгенерированные отчеты, временные файлы).
    • Как реализовать: Использовать IHostingEnvironment / IWebHostEnvironment для получения путей.

      public class FileService {
      private readonly IWebHostEnvironment _env;
      public FileService(IWebHostEnvironment env) => _env = env;
      
      public string GetAppStoragePath() {
          return Path.Combine(_env.ContentRootPath, "App_Data");
      }
      }

Вывод: Выбор механизма зависит от типа данных (кэш, конфигурация, файлы), требований к производительности, сохранности при перезапуске и потокобезопасности.