dotnet Web API c# Вызов контроллера из другого контроллера

Есть Модель1, соответствующая ей Таблица1, Контроллер1 с методами Create и Patch. Каждый вызов метода Create заполняет эту таблицу множеством строк. Вызов метода Patch меняет одно свойство в одной строке таблицы.

Также есть Модель2, Таблица2 и Контроллер2. Надо чтобы при действии метода Patch в Контроллере1 изменённая строка из Таблицы1 писалась в Таблицу2 (видимо через запуск метода Create в Контроллере2).

Как это сделать?

Пишут, что такая ситуация это признак неверного проектирования БД, но я не согласен.

Наверное можно сделать 2й метод POST в Контроллере1, и дёргать его (и вообще сделать один общий контроллер), но это мне кажется неправильным, т.к. разные таблицы, сущности, модели, модули (соблюдаем низкий Coupling и высокий Cohesion) и лучше оставить разные контроллеры.

Также ИИ подсказывает 'внедрить зависимость через конструктор контроллера", но это, извините, ежу понятно.

Не разместил тут никакого кода, т.к. непонятно что именно надо показать. Cоответственно такой же 'теоретический' ответ меня устроит.


Ответы (1 шт):

Автор решения: Garp

Надо было сразу пояснить: такая ситуация сложилась из-за отсутствия фронтенда. После написания фронта по нажатию кнопки будет запускаться какойнибудь handleClickButton, который будет вызывать несколько методов, каждый из которых запустить свой fetch к разным контроллерам.

Но пока что фронта нет, бекенд тестируется на Сваггере. И надо сделать вызов одного контроллера из другого.

Меня смущала такая конструкция, добавляющая coupling (проще говоря, снижающая изоляцию модулей), но на время разработки наверное можно и так.

[Route("api/[controller]")]
[ApiController]
public class Controller1 : ControllerBase
    {
        private readonly IService1 _service1;
        private readonly IService1 _service2;

        public Controller1(IService1 service1, IService2 service2)
        {
            _service1 = service1;
            _service2 = service2;
        }

[HttpPatch]
public async Task<ActionResult<Guid>> MethodName([FromBody] MyRequest request)
        {
            var id = await _service1.someMethod(request.something1, request.something2);
            await _service2.moreMethod(request.something3, request.somethin4, request.somethin5); 
            return Ok(id);
        }
→ Ссылка