WedX - журнал о программировании и компьютерных науках

Как обеспечить определение одинаковых конечных точек в двух разных контроллерах API ASP.Net Core?

У меня есть требование иметь 2 API данных, каждый из которых должен иметь одинаковые методы или конечные точки для реализации. Например, у нас может быть интерфейс, чтобы убедиться, что два класса будут иметь одинаковые функции. Потусторонний, вы определяете контракт.

public interface ITest
{
    void Foo();
}

public class Test : ITest
{
    public void Foo()
    {
        // Some logic
    }
}

public class OtherTest : ITest
{
    public void Foo()
    {
        // Some other logic 
    }
}

Точно так же мне нужны контроллеры, у которых будут маршруты и методы, как показано ниже. Скажем, в одном добавляется новое действие, код должен применять его в другом контроллере.

DemoController
-- GET demo/api/action1
-- GET demo/api/action2

TestController
-- GET test/api/action1
-- GET test/api/action2

Как этого добиться?

24.01.2019

  • не ясно понимаю, но вы можете взглянуть на фильтр маршрута, добавить фильтр маршрута в действие. docs.microsoft.com/en- США/ASPNET/ядро/MVC/контроллеры/ 24.01.2019
  • маршрут, который вы описали, может быть установлен только вручную, так как маршрут обычно {domain}/{controller}/{action} в соответствии с вашим примером того, что вы хотите, чтобы маршрут был больше чем-то вроде {domain}/api/Testcontroller/action1 и {domain}/api/DemoController/action1 24.01.2019
  • я имею в виду наследование в сторону, можете ли вы уточнить эту часть, прежде чем отвечать на остальное, это то, что вы хотите, или точно в соответствии с вашим примером. 24.01.2019

Ответы:


1

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

Что касается обеспечения аналогичной структуры маршрутизации, то для этого можно использовать наследование. Определите базовый абстрактный класс контроллера. Вы можете либо реализовать свой интерфейс здесь, либо «реализовать» необходимые методы как абстрактные. Любой производный класс будет вынужден реализовывать любые абстрактные методы в базовом классе, поэтому он имеет тот же эффект, что и интерфейс. Технически это означает, что вы можете отказаться от интерфейса, если хотите, и просто полагаться на базовый класс, форсирующий реализацию. Вам решать. Затем вы можете применить атрибуты маршрута к своим абстрактным методам следующим образом:

[Route("[controller]/api")]
public abstract BaseApiController : ControllerBase
{
    [HttpGet("action1")]
    public abstract IActionResult Action1();

    [HttpGet("action2")]
    public abstract IActionResult Action2();
}
24.01.2019

2

если вы имеете дело с разными сущностями, для которых требуется схожая бизнес-логика, вы можете создать универсальный базовый контроллер и также внедрить свои общие зависимости:

[Route("api/[controller]")]
[ApiController]
public class GenericBaseController<T> : ControllerBase where T : class
{
    private readonly ILogger _logger;

    public GenericBaseController(ILogger<GenericBaseController<T>> logger) {
        _logger = logger;
    }

    [HttpGet("get")]
    public IActionResult Get()
    {
        //...
    }

    [HttpPost("post")]
    public IActionResult Post(T value)
    {
        //...
    }
}

то вы можете расширить универсальный контроллер:

[Route("api/[controller]")]
[ApiController]
public class MyFirstController : MyFirstController<FirstModel>
{
    public GenericBaseController(ILogger<MyFirstController> logger) : base(logger) 
    {
    }
}

Еще один:

[Route("api/[controller]")]
[ApiController]
public class MySecondController : GenericBaseController<SecondModel>
{
    public MySecondController(ILogger<MySecondController> logger) : base(logger) 
    {
    }
}

Вам не нужно заново создавать методы для каждого унаследованного контроллера, если это одна и та же логика, или вы можете расширить любой из них, если вам нужно:

[Route("api/[controller]")]
[ApiController]
public class MyThirdController : GenericBaseController<ThirdModel>
{
    public MyThirdController(ILogger<MyThirdController> logger) : base(logger) 
    {
    }

    [HttpPost("post")]
    public IActionResult Post(ThirdModel value)
    {
        // do some logic...
        return base.Post(value);
    }
}
25.01.2019
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]