Контроллеры ASP.NET Core MVC в отдельной сборке
Я использую ASP.NET MVC Core RC-2. У меня есть веб-проект, ориентированный на полную платформу .NET. У меня также есть отдельная библиотека классов в решении, а также таргетинг на полную структуру.
В библиотеке классов у меня есть контроллер, отмеченный атрибутом маршрута. Я ссылался на библиотеку классов из веб-проекта. Эта сборка ссылается на пакет nuget Microsoft.AspNetCore.Mvc v. 1.0.0-rc2-final
.
Я понял, что этот внешний контроллер будет обнаружен автоматически, например.
http://www.strathweb.com/2015/04/asp-net-mvc-6-discovers-controllers/
Однако это не работает для меня - я просматриваю URL-адрес маршрута, и я получаю пустую страницу, и он не попадает на контрольную точку контроллера.
Любые идеи, как заставить это работать?
Интересно, что он, похоже, работает для веб-проектов, ориентированных на .NET Core Framework, ссылаясь на библиотеку классов, также ориентированную на .NET Core. Но не для веб-проекта, ориентированного на полную структуру, ссылаясь на стандартную библиотеку классов .NET.
Примечание: это MVC Core, который должен поддерживать такой сценарий без переопределения MVC <= 4.
Ответы
Ответ 1
Я считаю, что вы столкнулись со следующей известной проблемой в RC2.
https://github.com/aspnet/Mvc/issues/4674 (обходной путь упоминается в ошибке)
Это исправлено с тех пор, но будет доступно только в следующей версии (если вы не используете ночные сборки)
Ответ 2
Все еще проблема в ASP.Net Core 1.0, не уверен, если она по дизайну сейчас. Самое простое решение - сделать это в Startup.cs/ConfigureServices
services.AddMvc()
.AddApplicationPart(typeof(<class in external assembly>).GetTypeInfo().Assembly)
.AddControllersAsServices();
AddApplicationPart явно включает сборку в поисках контроллеров.
Вызов AddControllersAsServices() добавит все обнаруженные контроллеры в коллекцию служб, и если вы поместите контрольную точку после этой строки и проверите "сервисы", вы увидите в коллекции все найденные типы контроллеров.
Вы также можете проверить здесь: https://docs.asp.net/en/latest/migration/rc1-to-rtm.html#asp-net-5-mvc-compile-views, поскольку правила обнаружения теперь изменены для контроллеров с RC1.
Также не забудьте использовать IActionResult вместо ActionResult!