Как использовать контроллер в другой сборке в ASP.NET Core MVC 2.0?

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

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

Итак, есть этот модуль, который называется school, и в нем есть TeacherController. Результатом этого является Contoso.School.UserService.dll.

Основной оркестр называется Education и он имеет ссылку на Contoso.School.UserService.dll.

Моя program.cs:

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args).UseKestrel()
            .UseStartup<Startup>()
            .Build();

Однако для маршрутов учителя-контролера я получаю 404. Как использовать контроллеры в других сборках?

Ответы

Ответ 1

Внутри метода ConfigureServices класса Startup вы должны вызвать следующее:

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

Если assembly является экземпляром Assembly представляющим Contoso.School.UserService.dll.

Вы можете загрузить его либо из любого включенного типа, либо так:

var assembly = Assembly.Load("Contoso.School.UserService");

Ответ 2

У Мартина выше есть ответ, спасибо. Однако не сразу очевидно, как передать сборку в Startup.ConfigureServices. Как я этого добился, было... в коде, где я создаю и запускаю webHost, я вызываю IWebHostBuilder.ConfigureServices и даю ему что-то, содержащее сборку (в моем случае пользовательский интерфейс с именем IOutputProcess)

            _webHost = CreateWebHostBuilder().ConfigureServices(e => e.AddSingleton(_outputProcess)).Build();
            _webHost.Start();

затем в моем Startup.ConfigureServices я извлекаю этот экземпляр из коллекции IServiceCollection с помощью...

    public void ConfigureServices(IServiceCollection services)
    {
        var sp = services.BuildServiceProvider();
        var outputProcess = sp.GetService<IOutputProcess>();
        services.AddMvc().AddApplicationPart(outputProcess.ControllerAssembly).AddControllersAsServices();
    }

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