Тестовое задание для программиста
Реализация REST API
Фреймворк .net 4.7
Применяемые компоненты: NancyFx, TopShelf, Dapper, Autofac либо дефолтный DI Nancy, Serilog, LibLog
Приложение должно быть реализовано в виде Self-hosted веб сервиса Nancy и иметь возможность запускаться в виде службы либо консольного приложения (TopShelf). Serilog должен настраиваться только в исполняемом модуле.
Приложение должно содержать 3 сборки
Persons.Service – исполняемый модуль
Persons.Abstractions – контракты команд и Query
Persons – реализации web-модулей Nancy, IQueryHandler, ICommandHandler
В проекте применить паттерн CQRS.
БД можно использовать любую, чем меньше усилий будет требоваться для запуска проекта, тем лучше. Как вариант можно использовать SQLite (in memory) и т.д.
Реализовать 2 Usecase
- CreatePerson
Создание сущности (DDD) Person по имени и дате рождения. У сущности должно быть вычисляемое поле Age. Создается фабричным методом класса. Метод возвращает null, если возраст больше 120 лет или Name пустой.
Сущность должна сохраняться в репозитории, реализущем интерфейс
IPersonRepository
{
Person Find(Guid id);
void Insert(Person item);
}
Реализация должна быть на Dapper.
Реализация Usecase должна быть оформлена в виде обработчика команды CreatePerson.
Пришедшая команда в обработчике должна логгироваться через LibLog.
- GetPerson
Вернуть Person по id.
Реализация Usecase должна быть оформлена в виде обработчика Query GetPerson, но возвращать не доменный объект, а плоский Dto, сериализуемый в JSON.
Команды/query должны поступать по REST API.
- CreatePerson
POST /api/v1/persons/
JSON-body {“Name”:”…”, “BirthDay”:”1977-07-07”}
Возвращаемый код
Created + заголовок Location /api/v1/persons/{person_id}, если команда выполнена
BadRequest, если невозможно создать команду из присланных данных
UnprocessableEntity, если созданная сущность невалидна
- GetPerson
GET /api/v1/persons/{person_id}
Возвращаемый код
ОК + JSON-body {“Name”:”…”, “BirthDay”:”1977-07-07”}, если сущность найдена
NotFound, если не найдена
Должно быть реализовано 2 веб-модуля Nancy, вызывающие соответствующие обработчики. Зависимости должны быть инжектированы через конструктор.