Как использовать контроллер в другой сборке в 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();
}
Я сомневаюсь, что создание поставщика услуг исключительно для этой цели - самый чистый способ сделать что-то, но это работает. (Я открыт для лучших идей)