Найти в Дзене
Wissance

Создаем C# ASP.NET приложения качественно и быстро в 1 строку кода

Речь идет, конечно, не обо всем приложении, но что ни маловажно о целом REST-контроллере. Да, REST API не смотря на наличие других вариантов таких, как GraphQL и gRPC все еще остается основым китом разработки Web-решений. Занимаясь достаточно много написанием ASP Net/ASP Net Core приложений я заметил, что REST в целом очень похож, т.е. мы используем одни и те же подходы при построении наших собственных приложений. Раз есть повторяемость значит есть и пространство для автоматизации. Чтож сказано, значит сделано, мы создали нашу библиотеку, которая позволяет гибко решать задачи, связанные с построением единообразных REST-интерфейсов, имеющий одинаовый стиль именования методов и параметров-запроса. Для этих целей нами была создана библиотека с открым исходным кодом с помощью которой мы и будем создавать Web-приложения качественно и быстро! В любом деле важна подготовка, для того, чтобы создавать REST-контроллеры в 1 строку необходимо минимум подготовать классы, имплементирующие интерфейс
Оглавление
Создаем качественные ASP .Net (C#) REST контроллеры и gRPC сервисы  в 1 строку кода
Создаем качественные ASP .Net (C#) REST контроллеры и gRPC сервисы в 1 строку кода

Речь идет, конечно, не обо всем приложении, но что ни маловажно о целом REST-контроллере. Да, REST API не смотря на наличие других вариантов таких, как GraphQL и gRPC все еще остается основым китом разработки Web-решений. Занимаясь достаточно много написанием ASP Net/ASP Net Core приложений я заметил, что REST в целом очень похож, т.е. мы используем одни и те же подходы при построении наших собственных приложений. Раз есть повторяемость значит есть и пространство для автоматизации. Чтож сказано, значит сделано, мы создали нашу библиотеку, которая позволяет гибко решать задачи, связанные с построением единообразных REST-интерфейсов, имеющий одинаовый стиль именования методов и параметров-запроса. Для этих целей нами была создана библиотека с открым исходным кодом с помощью которой мы и будем создавать Web-приложения качественно и быстро!

Что нужно для создания REST

В любом деле важна подготовка, для того, чтобы создавать REST-контроллеры в 1 строку необходимо минимум подготовать классы, имплементирующие интерфейс IModelIdentifiable . Примером проекта, использующего WebApiToolkit является проект Wissance.WeatherControl . Возьмем к примеру Entity-класс StationEntity:

using System;
using System.Collections.Generic;
using Wissance.WeatherControl.Data.Model;
using Wissance.WebApiToolkit.Data.Entity;
namespace Wissance.WeatherControl.Data.Entity
{
public class StationEntity : IModelIdentifiable<Guid>
{
public Guid Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Longitude { get; set; }
public string Latitude { get; set; }
public virtual IList<SensorEntity> Sensors { get; set; }
}
}

В целом для минимальной версии мы можем обойтись без отдельного представления Entity-классов в виде Dto и Factory-классов для преобразования Entity в Dto, пример создания в 1 строку . В указанном примере мы получили 2 строки т.к. для удобства восприятия было разделено создание сборки (Assembly) и добавление контроллеров из сборки, пример:

Assembly stationControllerAssembly =
services.AddSimplifiedAutoController<ModelContext, StationEntity, Guid, EmptyAdditionalFilters>(dbContext, "Station", ControllerType.FullCrud, null, loggerFactory);
services.AddControllers().AddApplicationPart(stationControllerAssembly).AddControllersAsServices();

При добавлении автоматического контроллера первый параметр - DbContext (EntityFramework), второй - имя контроллера, третим параметром указывается тип контроллера:

  • ControllerType.ReadOnly - контроллер только для чтения c двумя методами на получение массива объектов и одного объекта по id
  • ControllerType.FullCrud - полный Crud с дефолтной реализацией Create, Update и Delete - методов
  • ControllerType.Bulk - аналогичен Crud только операции создания, обновления и удаления выполняются над массивом обеъктов или идентификаторов (bulk delete)

Какие технические ограничения у нас есть при использовании минимального варианта с подготовкой только Entity-классов:

  1. При использовании Entity-классов в качестве DTO, Entity-классы не могут иметь virtual навигационные свойства для LazyLoading
  2. При создании/обоновлении REST-ресурсов в БД не будут создаваться связанные сущности.

Для решения этих проблем была подготовлена усложненная версия автоматических контроллеров, которая принимает ManagerConfiguration с делегатами на создание DTO из Entity и создание и обновление Entity из DTO.

Практический результат

  1. При использовании WebApiToolkit мы получаем следующее:
  2. Единообразный формат API
  3. Модульную структуру Web-приложения
  4. Возможность паралельного использования как REST API, так и gRPC-сервисов
  5. Значительная экономия времени при написании кода причем без кодогенерации, а только протестированный библиотечный код

Для использования WebApiToolkit в своих проектах можно посмотреть полностью готовые примеры:

  1. В тестовом приложении, используемом в юнит-тетсах
  2. В полноценном приложении (REST API) для управления данными с метеостанций

Благодарим за прочтение и просим поддержать наш проект звездой на гитхаб.