Шаблоны проектирования были разработаны для решения проблем, которые часто встречаются в программных приложениях. Они представляют собой решения повторяющихся проблем и сложностей при разработке программного обеспечения. Шаблоны проектирования делятся на три отдельные категории: творческие, структурные и поведенческие.
Шаблоны творческого проектирования используются для абстрагирования и упрощения создания объектов. Структурные шаблоны используются для определения отношений между объектами (например, наследование и композиция). А поведенческие шаблоны проектирования используются для управления способами взаимодействия объектов друг с другом (например, сотрудничество и делегирование).
Шаблон дизайна декоратора — это структурный шаблон, который можно использовать для динамического или статического придания функциональности или поведения объекту без изменения структуры объекта. В этой статье мы будем использовать шаблон декоратора для реализации кэша в памяти в приложении ASP.NET Core.
Обратите внимание, что ASP.NET Core не имеет объекта кэша, как его предшественник ASP.NET. Тем не менее, он предлагает различные варианты кэширования, включая кэширование в памяти, распределенное кэширование и кэширование ответов. Мы можем легко реализовать кэширование в приложении ASP.NET Core, используя возможности промежуточного программного обеспечения или сервисов вместе с шаблоном декоратора.
Чтобы использовать примеры кода, представленные в этой статье, в вашей системе должна быть установлена Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.
Создайте проект веб-API ASP.NET Core в Visual Studio 2022.
Чтобы создать проект веб-API ASP.NET Core 7 в Visual Studio 2022, выполните действия, описанные ниже.
- Запустите интегрированную среду разработки Visual Studio 2022.
- Нажмите «Создать новый проект».
- В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
- Нажмите “Далее.
- В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
- При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
- Нажмите “Далее.
- В следующем окне «Дополнительная информация» оставьте флажок «Использовать контроллеры (снимите флажок, чтобы использовать минимальные API)». В этом проекте мы не будем использовать минимальные API.
- В другом месте окна «Дополнительная информация» оставьте для параметра «Тип аутентификации» значение «Нет» (по умолчанию) и убедитесь, что флажки «Включить поддержку Open API», «Настроить для HTTPS» и «Включить Docker» остаются снятыми. . Мы не будем здесь использовать ни одну из этих функций.
- Нажмите Создать.
Мы будем использовать этот проект веб-API ASP.NET Core для работы с примерами кода в разделах ниже.
Что такое кэшированный репозиторий? Зачем он нам нужен?
Шаблон репозитория — это широко используемый шаблон проектирования, который помогает отделить логику доступа к данным от остальной части приложения. Кэшированный репозиторий используется для повышения эффективности и производительности операций доступа к данным. Он сочетает в себе широко используемый шаблон репозитория с методами кэширования.
Инкапсуляция таких операций, как запрос, вставка, обновление и удаление данных, в классе репозитория обеспечивает четкий уровень абстракции, который позволяет приложению взаимодействовать с базовым хранилищем данных через репозиторий. Добавляя в репозиторий функцию кэширования, мы можем сократить повторяющиеся ресурсоемкие операции доступа к данным и повысить производительность нашего приложения.
Как работает кэшированный репозиторий
Вот как обычно работает кэшированный репозиторий:
- Кэшированный репозиторий сначала проверяет, хранятся ли в кеше запрошенные клиентом данные.
- Если данные не найдены в кеше, кэшированный репозиторий передаст запрос базовому репозиторию. Базовый репозиторий затем получит данные из исходного источника, например базы данных.
- После того, как данные извлекаются из источника данных, они сохраняются в кэше.
- Наконец, запрошенные данные возвращаются клиенту.
Использование механизма кэширования повышает общую производительность и снижает нагрузку на источник данных. Вместо выполнения дорогостоящей операции по извлечению данных из базового источника данных снова и снова, последующие запросы тех же данных могут обслуживаться из кэша.
Вы можете реализовать кэшированные репозитории, используя различные механизмы кэширования, такие как кэширование в памяти, распределенное кэширование или даже собственные решения для кэширования. Кэшированный репозиторий может значительно повысить производительность вашего приложения за счет сокращения времени доступа к данным, уменьшения задержек и улучшения масштабируемости.
Минимизируя количество обращений к исходному источнику данных, кэшированный репозиторий повышает скорость отклика приложения. Однако поддержание согласованности данных кэша с фактическим источником данных требует тщательного рассмотрения стратегий аннулирования кэша.
Создайте репозиторий кэша в ASP.NET Core.
Прежде чем создавать хранилище кэша, давайте создадим класс модели для нашего приложения. Щелкните правой кнопкой мыши наш проект веб-API в окне обозревателя решений и создайте новый файл .cs. Замените сгенерированный по умолчанию код следующим фрагментом кода, чтобы создать наш класс модели.
public class Author { public Guid Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; } public string Phone { get; set; } public string City { get; set; } public string PostalCode { get; set; } public string Country { get; set; } }
Затем создайте интерфейс с именем IAuthorRepository, который содержит объявление методов, соответствующих операциям, поддерживаемым нашим классом репозитория. Замените сгенерированный по умолчанию код следующим кодом.
public interface IAuthorRepository { Task<List<Author>> GetAuthorsAsync(); }
Теперь создайте новый класс с именем AuthorRepository в файле с тем же именем и расширением .cs и введите туда следующий код.
public class AuthorRepository: IAuthorRepository { private readonly List<Author> authorList; public AuthorRepository() { authorList = new List<Author>() { new Author() { Id = Guid.NewGuid(), FirstName = "Joydip", LastName = "Kanjilal", Address = "1 ABC Road", City = "Hyderabad", Country = "India", PostalCode = "500089", Phone = "1234567890" }, new Author() { Id = Guid.NewGuid(), FirstName = "Steve", LastName = "Barnes", Address = "9/2A CT Road", City = "Chicago", Country = "USA", PostalCode = "101010", Phone = "0987654321" }, new Author() { Id = Guid.NewGuid(), FirstName = "Michael", LastName = "Bogan", Address = "81 Red Road", City = "Sydney", Country = "Australia", PostalCode = "123456", Phone = "1212121212" } }; } public async Task<List<Author>> GetAuthorsAsync() { return await Task.FromResult(authorList); } }
Создайте класс декоратора с функцией кэширования.
Для реализации функции кэширования мы будем использовать другой интерфейс, называемый ICachedAuthorRepository. Интерфейс ICachedAuthorRepository объявляет только один метод с именем GetCachedAuthorsAsync(), как показано в приведенном ниже фрагменте кода.
public interface ICachedAuthorRepository
{
Task> GetCachedAuthorsAsync();
}
Теперь мы создадим класс декоратора с функцией кэширования. Для этого создайте новый класс под названием AuthorCachingDecorator, реализующий тот же интерфейс ICachedAuthorRepository, и напишите туда следующий код.
public class AuthorCachingDecorator : ICachedAuthorRepository
{
частный только для чтения IMemoryCache _memoryCache;
частный только для чтения IAuthorRepository _authorRepository;
общедоступный AuthorCachingDecorator (IMemoryCache MemoryCache,
IAuthorRepository авторРепозиторий)
{
_memoryCache = MemoryCache;
_authorRepository = авторRepository;
}
общедоступная асинхронная задача> GetCachedAuthorsAsync()
{
const stringcacheKey = “Автор”;
если (!_memoryCache.TryGetValue(cacheKey,
out List
{
кэшированные данные = ждут _authorRepository.GetAuthorsAsync();
_memoryCache.Set(cacheKey, кэшированные данные,
TimeSpan.FromMinutes(10));
}
вернуть кэшированные данные;
}
}
В методах CachedAuthorsAsync данные, полученные впервые, сохраняются в кеше перед их возвратом. Для всех последующих вызовов данные возвращаются из кэша. Данные в кэше сохраняются в течение 10 минут, по истечении которых кэшированные данные становятся недействительными, т. е. данные из кэша удаляются. Кэш будет снова заполнен свежими данными при следующем вызове, и та же процедура продолжится.
Обратите внимание, как внедрение зависимостей используется в классе AuthorCachingDecorator для получения экземпляра типа IAuthorRepository. Этот экземпляр используется для получения данных путем вызова метода GetAuthorsAsync, относящегося к классу AuthorRepository.
Рисунок 1. Реализация кэша в памяти в ASP.NET Core.
Если данные уже доступны в кэше, метод GetAuthorsAsync класса AuthorRepository вызываться не будет.
Настройте файл Program.cs
Еще два шага, и мы сможем запустить наше приложение. Мы должны добавить наши службы кэширования памяти в IServiceCollection, используя следующий фрагмент кода в файле Program.cs.
builder.Services.AddMemoryCache();
Нам также следует добавить экземпляры типов IAuthorRepository и ICachedAuthorRepository в IServiceCollection, используя приведенный ниже код.
builder.Services.AddScoped<IAuthorRepository, AuthorRepository>(); builder.Services.AddScoped<ICachedAuthorRepository, AuthorCachingDecorator>();
Полный исходный код файла Program.cs приведен ниже для справки.
var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddMemoryCache(); builder.Services.AddScoped<IAuthorRepository, AuthorRepository>(); builder.Services.AddScoped<ICachedAuthorRepository, AuthorCachingDecorator>(); builder.Services.AddControllers(); var app = builder.Build(); // Configure the HTTP request pipeline. app.UseAuthorization(); app.MapControllers(); app.Run();
Наконец, когда вы запускаете приложение, данные автора должны отображаться в вашем веб-браузере, как показано на рисунке 2.
Рисунок 2. Наш кэш в памяти в действии.
Для простоты мы использовали здесь простой репозиторий, в котором данные хранятся в коллекции. Естественно, для реального приложения вы бы изменили эту реализацию, чтобы получать записи из базы данных. Вы будете поражены приростом производительности, который вы получите, если будете читать кэшированные данные вместо обращения к базе данных для их извлечения.
Дальше читайте это:
- Облачные вычисления больше не являются пустяком
- Что такое генеративный ИИ? Искусственный интеллект, который создает
- Программирование с помощью ИИ: советы и лучшие практики от разработчиков
- Python пытается удалить GIL и повысить параллелизм
- 7 причин, по которым Java по-прежнему хороша
- Война за лицензирование открытого исходного кода окончена