Как вызвать метод контроллера из промежуточного программного обеспечения и разрешить вызов этого метода только из этого промежуточного программного обеспечения? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть контроллер, который имеет 2 функции и промежуточное ПО.

Мое промежуточное ПО

try
{
    var request = httpContext.Request;
    if (/* some logic here */)
    {
        await _next(httpContext);

        // Some logic here
        var someReturnValue = someFunction();

        // Need to call the Controller Method here
        // call SaveStaging(someReturnValue);
    }
    else
    {
        await _next(httpContext);
    }
}
catch (Exception ex)
{
    await _next(httpContext);
}

В моем контроллере

[Authorize(AuthenticationSchemes = "APIKeyAuthentication")]
[LogAction]
[ApiController]
[Route("api/[controller]/[action]")]
public class MyController : ControllerBase
{
    private IHttpContextAccessor _accessor;

    public MyController(IHttpContextAccessor accessor)
    {
        _accessor = accessor;
    }

    [HttpPost]
    public async Task<ActionResult<ServiceResult>> PostData([FromBody] DataObj request)
    {
        ServiceResult result = new ServiceResult();
        result.isSuccessful = true;
        return Ok(result);
    }

    public async Task SaveStaging(int logNumber)
    {

    }
}

Итак, изначально пользовательвызовет конечную точку PostData. В этом методе он вернет, что принимает данные, опубликованные пользователем. Затем в промежуточном программном обеспечении мне нужно будет кое-что сделать, и, наконец, я бы хотел вызвать метод SaveStaging в контроллере. Я хочу, чтобы этот SaveStaging метод был доступен только для промежуточного программного обеспечения и не должен вызываться напрямую пользователем.

Поэтому мой вопрос:

  1. Как вызвать этот метод изпромежуточное ПО?
  2. Как ограничить SaveStaging доступностью только промежуточного ПО?

1 Ответ

1 голос
/ 08 ноября 2019

Вы должны рассмотреть возможность включения SaveStaging в сервис, потому что это кажется сквозной задачей. Кроме того, вероятно, было бы целесообразно реализовать многоуровневую архитектуру с точки зрения рефакторинга.

Поскольку это ядро ​​.NET, я бы рекомендовал полностью охватить внедрение зависимостей и внедрить службу в ваше промежуточное ПО.

public interface IStagingService 
{
    Task Save(int logNumber);
}

public class MyController : ControllerBase
{
    private readonly IStagingService _service;
    private readonly IHttpContextAccessor _accessor;

    public MyController(IStagingService service, IHttpContextAccessor accessor)
    {
        _service = service ?? throw new ArgumentNullException(nameof(service));
        _accessor = accessor  ?? throw new ArgumentNullException(nameof(accessor));;
    }
    //....
}

public class MyMiddleware
{
    private readonly RequestDelegate _next;
    private readonly IStagingService _service;

    public RequestCultureMiddleware(RequestDelegate next, IStagingService service)
    {
        _next = next;
        _service = service ?? throw new ArgumentNullException(nameof(service));
    }

    public async Task InvokeAsync(HttpContext context)
    {
    // ...
}

В начале, ваши услуги, скорее всего, начнутся маленькими и простыми. В случае роста приложения сложность этого уровня, вероятно, возрастет, что порождает потребность в некоторых фасадных службах (т.е. службах, состоящих из служб) и, возможно, некоторых провайдерах для таких вещей, как доступ к данным.

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