Содержит основные доменные сущности:
- BicycleModel — модель велосипеда (название, тип, цена за час)
- Bicycle — конкретный велосипед, связанный с моделью
- Renter — арендатор, содержащий персональные данные
- Rental — аренда велосипеда (начало, длительность, арендатор, велосипед)
Также определён универсальный интерфейс IRepository<TEntity, TKey>
для работы с различными хранилищами данных.
DTO-классы и контракты для API:
EntityDto— используется для возврата сущностей из запросовEntityCreateUpdateDto— для создания и обновления сущностейRentalDto/RentalCreateUpdateDto— DTO для аренды с полями
BicycleId,RenterId,StartAt,DurationHours
Содержит интерфейсы сервисов (IBicycleService, IRenterService, IRentalService и т.д.),
реализуемые в проекте Application.
Реализует бизнес-логику и сервисы, использующие контракты из Application.Contracts.
Сервисы:
BicycleServiceBicycleModelServiceRenterServiceRentalService
Используется AutoMapper для маппинга между сущностями и DTO.
Метод MapWithPrice() в RentalService рассчитывает стоимость аренды по длительности и модели велосипеда.
Реализация in-memory репозиториев, позволяющая работать без базы данных.
Каждый репозиторий наследуется от InMemoryRepository<TEntity>
и реализует IRepository<TEntity, int>.
Реализованы репозитории:
BicycleModelInMemoryRepositoryBicycleInMemoryRepositoryRenterInMemoryRepositoryRentalInMemoryRepository
Используются для тестирования и отладки без внешних зависимостей.
Основной REST API-проект, реализующий контроллеры, Swagger и логирование.
Контроллеры наследуются от базового класса:
CrudControllerBase<TDto, TCreateUpdateDto, TKey>BicycleModelsControllerBicyclesControllerRentersControllerRentalsController
Каждый контроллер предоставляет CRUD-операции:
GET /api/{entity}, GET /api/{entity}/{id}, POST, PUT, DELETE
- Для
RentalsиспользуетсяTimeSpanSchemaFilter, отображающийDurationHoursкорректно как"hh:mm:ss". - Swagger включает XML-комментарии из всех зависимых сборок.
- Все контроллеры используют
ILoggerдля логирования ошибок и действий.
Фильтр TimeSpanSchemaFilter, расположенный в:
BicycleRental.Api/Swagger/TimeSpanSchemaFilter.cs
Корректирует отображение TimeSpan в Swagger UI:
Пример корректного тела запроса:
{
"bicycleId": 1,
"renterId": 2,
"startAt": "2025-11-10T12:00:00Z",
"durationHours": "03:00:00"
}Файл BicycleRental.Api/Program.cs выполняет:
- Регистрацию AutoMapper (
BicycleRentalProfile) - Регистрацию in-memory репозиториев и сервисов
- Настройку контроллеров
- Подключение Swagger с XML-комментариями всех сборок
Swagger автоматически добавляет документацию для всех проектов решения.