Где разместить методы контроллера hepler, чтобы сохранить гармонию с шаблонами проектирования при сборке. NET Core Api? - PullRequest
1 голос
/ 09 марта 2020

Я новичок в создании API, и сейчас я пытаюсь создать свое первое приложение. Я бы хотел, чтобы архитектура моего приложения была максимально совместима с шаблонами проектирования. У меня есть сервисный уровень, сервисы внедряются в контроллеры и отвечают за связь с репозиториями. Я хотел бы разделить некоторые из моих логик c, расположенных в контроллерах, чтобы сделать мой код более чистым. В качестве примера у меня есть контроллер:

[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{

    private readonly IUserService _userService;

    public UsersController(IUserService userService) : base()
    {

        this._userService = userService;

    }

    [HttpPost("authenticate")]
    public async Task<IActionResult> AuthenticateUserAsync(AuthenticationDTO authentication)
    {

        var user = await _userService.AuthenticateUserAsync(authentication.Username, authentication.Password);

        var tokenString = .....

    }

...

} 

Я хотел бы создать метод, отвечающий за генерацию токена аутентификации. Где мне найти такую ​​логи c? Должен ли я поместить его в UserService, или, возможно, написать в классе UsersController? Могу ли я написать частные методы в классах контроллеров, или, может быть, контроллеры должны содержать только методы, предоставляемые через интерфейс API?

Ответы [ 3 ]

0 голосов
/ 09 марта 2020

Технически, компилятор позволяет вам писать приватный метод в контроллере. Это как обычный класс. Тем не менее, вы должны поставить все на службу, чтобы вы отключили лог c от контроллера. (Например, позже вы можете легко перенести свои логи c в другой пользовательский интерфейс, например MVC вместо веб-API)

В вашем примере генерация токенов не должна выполняться в контроллере или userService. Я думаю, что лучше всего иметь сервис TokenGenerator.

0 голосов
/ 09 марта 2020

Rest-Api - Подумайте о ресурсах.

Этот вопрос касается того, как вы думаете о ваших rest-api (если вы его создаете). Существуют различия между rest api, web apis и SOAP, но я предполагаю, что вы создаете rest-api.

В случае универсального c web api, вам придется выберите способ разбить ваше приложение на несколько контроллеров.

Проверьте руководство Microsoft Rest-Api. Самый важный раздел из этого:

Организация API вокруг ресурсов

Итак, в вашем примере давайте предположим, что ваш ресурс - это сеанс пользователя. Тогда у вас может быть UserController с соответствующими глаголами, где вы можете создать (POST) обновление (PUT / PATCH), удалить (DELETE) или получить (GET) ресурс User.

Теперь вам нужно сеанс, не так ли? Или Знак. Легко:

TokenController и действие, конечно (POST) - Создать токен с именем пользователя и паролем

SessionController - Создать токен.

Таким образом, вы минимизирует действия. В качестве дополнения, если User имеет Accounts, то создайте новый контроллер с именем UserAccountsController, который будет сервером по URL для отдыха, например users/1/accounts GET

Уровень служб

Имея уровень услуг, где у вас есть все бизнес-логики c - это путь к go. Помня о том, что SRP (принцип единой ответственности), единственная и единственная обязанность Контроллера, состоит в том, чтобы контролировать поток кода для создания ответа Http и координировать действия для этого.

Фактическая бизнес-логика c должно быть реализовано на уровне сервиса. Таким образом, у вас будут контроллеры, которые даже с несколькими действиями будут весьма минимальными (4/5 строк на действие).

Наследование пользователя

Общая логика c между контроллерами может быть достигается с помощью MyApiController: ControllerBase, который содержит код многократного использования.

НЕ используйте классы Helper. Это антипаттерн. Утилиты - зло - отличная статья по этому вопросу.

0 голосов
/ 09 марта 2020

Просто поместите вспомогательные классы или методы в какую-нибудь папку, например, под названием Инфраструктура. Для этого примера просто создайте интерфейс ITokenGenerator с методом Generate (), создайте его класс реализации TokenGenerator и просто вставьте его в контроллер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...