Как вынести контроллеры в отдельные сборки?

102
14 января 2022, 03:50

Есть у меня веб-приложение, в котором соединено два очень разнородных api, скажем:

[Route("api1/[controller]")]
[ApiController]
public class FooController : ControllerBase
{
    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "foo value1", "foo value2" };
    }
}

и

[Route("api2/[controller]")]
[ApiController]
public class BarController : ControllerBase
{
    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "bar value1", "bar value2" };
    }
}

И хочу я вынести контроллеры по разным сборкам, что-то типа:

Каким образом это можно сделать?

Answer 1

Нашёл ответ на английском so:

How to use a controller in another assembly in ASP.NET Core MVC 2.0?

Для asp.net core 2.x:

services.AddMvc().AddApplicationPart(assembly).AddControllersAsServices();

Для 3.x:

public void ConfigureServices(IServiceCollection services)
{
    var assembly = typeof(**AnyTypeFromRequiredAssembly**).Assembly;
    services.AddControllers()
        .PartManager.ApplicationParts.Add(new AssemblyPart(assembly));
}

(в комментариях пишут, что и старые методы пока работают)

Итого, в моём примере:

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
            .AddApplicationPart(typeof(Application1.Controllers.FooController).Assembly)
            .AddApplicationPart(typeof(Application2.Controllers.BarController).Assembly)
            .AddControllersAsServices()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

Документация по теме:

  • Share controllers, views, Razor Pages and more with Application Parts
READ ALSO
Ado.NET C# Как изменить запись в DataTable?

Ado.NET C# Как изменить запись в DataTable?

Не смогла найти в интернете адекватного объяснения работы с DataTable для изменения записейЕсли у кого-то есть ссылки на источники, буду очень...

87
Ошибка: Fatal error: Uncaught Error: Call to a member function bindValue() on bool in…

Ошибка: Fatal error: Uncaught Error: Call to a member function bindValue() on bool in…

Выдаёт ошибку Fatal error: Uncaught Error: Call to a member function bindValue() on bool in… Не пойму, в чём может быть проблемаВывод var_dump($req); — bool(false)

265
Как определить, что файл в пути не имеет папок?

Как определить, что файл в пути не имеет папок?

Например, есть строка с названием файла без путиКак оределить, что нет пути? Делаю так, не работает:

107
Как избавится от дублирования записей в таблице БД при UPDATE?

Как избавится от дублирования записей в таблице БД при UPDATE?

На странице есть несколько полей формы с одинаковым именем name='protectMean[]'UPDATE срабатывает только если в самом последнем поле формы я меняю значение

80